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
------解决方案--------------------
这得留着学习啊。厉害。
------解决方案--------------------
额,还是笛卡尔积,代码不写了,你自己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的变换半角全角,
返回一个组合。
使用场景:一段内容 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
------解决方案--------------------
这得留着学习啊。厉害。
------解决方案--------------------
额,还是笛卡尔积,代码不写了,你自己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)];
}
}