150分 求标点符号排列组合算法

qqzeng-ip 2014-06-06 11:01:45
使用场景:一段内容 100字内,里面若干个标点符号 一般数量小于5个(不分全角半角) 如:

你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。

要求 除了句号 其他标点符号 可以相互转为半角或者全角 来组合 随便一些组合:

你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。
你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。
你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。
你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。
…………………………………………………………

变的只是 标点符号(除了句号) 可以互变半角全角 组合出不同语句(标点不同(全角或者半角))

可以看成这样 举个例子:
a b c
组合 位置不变 变得只是大小写而已
a b c
a B c
a B C
A b c
A B c
A B C

求 变换标点符号的所有句子(句号不用变)
...全文
284 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2014-06-07
  • 打赏
  • 举报
回复
额,还是笛卡尔积,代码不写了,你自己google“C# 笛卡尔积”瞬间搞定 “a,A” "b,B" "c.C" N个集合的笛卡尔积就是你的数学描述
gomoku 2014-06-07
  • 打赏
  • 举报
回复
假设0为不变, 假设1为改变(半角全角)。 在你的例子中,有3个地方可以变换标点,那么所有的变换组合为: 000 001 010 011 100 101 110 111 从二进制角度来看,它就是3个bits能表示的所有组合。而所有组合用数字来看就是0~7。 因此,对于N个变换点,组合总数就是‘2的N次方’。算法就是 循环所有0到‘2的N次方 - 1’的数字, 把数字换成二进制位表示,并对所有bit=1的变换半角全角, 返回一个组合。
class Test
{
    static void Main()
    {
        string input = "你是泊于青春的港口的一叶小舟!愿你扬起信念的帆,载着希望的梦幻,驶向辽阔的海洋。";
        foreach (var s in Permute(input))
        {
            // show s
        }
    }
    public static IEnumerable<string> Permute(string line)
    {
        char[] chars = line.ToCharArray();
        var indice = chars.Select((c, i) => new { C = c, I = i })
                            .Where(x => Punctuations.Contains(x.C))
                            .ToList();
        int count = 1 << indice.Count;
        for (int i = 0; i < count; i++)
        {
            for(int j = 0; j<indice.Count; j++)
            {
                chars[indice[j].I] = indice[j].C;
                if (((1 << j) & i) != 0)
                {
                    chars[indice[j].I] = ChangeCase(indice[j].C);
                }
            }
            yield return new string(chars);
        }
    }
    static string Punctuations = "!!,,";
    static char ChangeCase(char c)
    {
        int i = Punctuations.IndexOf(c);
        return Punctuations[i + (i % 2 == 0 ? 1 : -1)];
    }
}
Dogfish 2014-06-07
  • 打赏
  • 举报
回复
c(1,2)*c(1,2)*c(1,2) 好像是这样吧
wangnaisheng 2014-06-06
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
http://bbs.csdn.net/topics/390352804
这得留着学习啊。厉害。
qqzeng-ip 2014-06-06
  • 打赏
  • 举报
回复
引用 1 楼 bwangel 的回复:
不清楚你的目的是什么***
一条内容里面的符号变换半角或者全角 (除了句号不用处理,其他标点符号任意变换半角或者全角) 组出不同句子 内容一样只是符号不一样 (区分全角半角而已)
threenewbee 2014-06-06
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390352804
bwangel 2014-06-06
  • 打赏
  • 举报
回复
不清楚你的目的是什么,如果是为了判断用户输入的句子是不是你想要的,又担心用户乱输入全半角,你可以直接用Replace把全角符号全变为半角符号,再跟半角的标准答案比较。反之亦然。
方便的文本工具点击一下 方便的文本工具包括: - 大写 - 将所有字符转换为大写 - 小写 - 将所有字符转换为小写 - 计数字符 - 统计文本中的所有字符 - 数字 - 统计文字中的单词 - 计数行 - 计算文本中的新行 - 旋转13 - 在ASCII表格中向前移动每个字符13个位置 - 排序行alpha - 按字母顺序排列文本行 - 词频 - 每个词使用多少次 - 字符频率 - 每个字符使用多少次 - 表格中的列 - 允许您从HTML表中获取文本列。复制并粘贴文本字段中的表格内容,然后输入要提取的列号,然后按开始 - 修剪线 - 从行尾删除空格 - 替换文本 - 用另一个替换一个字符串 - 格式JSON - 漂亮格式的JSON字符串 - URLEncode - 将字符串编码为URL安全字符串 - URLDecode - 将URL安全字符串解码为常规字符串 - base64encode - 将文本编码为base64 - base64decode - 解码base64 sting - 添加行号 - 在每行文本前添加行号 - 拆文本 - 按隔符拆文本 - 为每一行添加前缀/后缀 - 根据所选的浏览器语言环境来格式化数字 - 下划线 - 为文字添加下划线 - 删除 - 通过文本罢工 ===== CHANGELOG ===== 1.0.12 - 增加了下划线和删除功能 1.0.11 - 保存/恢复上次使用的工具; 1.0.10 - 增加了自动编号格式; 1.0.9 - 为每一行功能增加了前缀/后缀; 1.0.8 - 固定替换;用新行添加替换; 1.0.7 - 从字频中去除(大部标点符号; 1.0.6 - 频率列表现在排序 1.0.5 - 添加标题大小写转换。您的文本从剪贴板填充; 1.0.4 - 添加Unix日期转换器的时间戳; 1.0.3 - 清洁的图标。删除了描述的链接; 1.0.2 - 小界面的改进; 1.0.1 - 工作剪裁线; 支持语言:English

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧