150分 求标点排列组合算法

150分 求标点符号排列组合算法
使用场景:一段内容 100字内,里面若干个标点符号 一般数量小于5个(不分全角半角) 如:

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

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

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

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

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

求 变换标点符号的所有句子(句号不用变)

------解决方案--------------------
不清楚你的目的是什么,如果是为了判断用户输入的句子是不是你想要的,又担心用户乱输入全半角,你可以直接用Replace把全角符号全变为半角符号,再跟半角的标准答案比较。反之亦然。
------解决方案--------------------
http://bbs.****.net/topics/390352804
------解决方案--------------------
引用:
http://bbs.****.net/topics/390352804
这得留着学习啊。厉害。
------解决方案--------------------
额,还是笛卡尔积,代码不写了,你自己google“C# 笛卡尔积”瞬间搞定

“a,A”
"b,B"
"c.C"

N个集合的笛卡尔积就是你的数学描述
------解决方案--------------------
c(1,2)*c(1,2)*c(1,2)
好像是这样吧
------解决方案--------------------
假设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)];
    }
}