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

求 变换标点符号的所有句子(句号不用变)
...全文
317 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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把全角符号全变为半角符号,再跟半角的标准答案比较。反之亦然。

111,094

社区成员

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

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

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