我正在寻找一种计算字符串的所有子串组合的方法,它们连接起来代表原始字符串,所以
"ice"
返回
[
["i", "c", "e"],
["i", "ce"],
["ic", "e"]
]
计算所有可能的子串很容易,但我不知道如何最终得到类似的组合。任何帮助表示赞赏。
干杯
答案 0 :(得分:1)
这类似于所有可能的拆分位置的generating the power set。
string: "ice"; positions: {1,2}
{} ["ice"]
{1} ["i", "ce"]
{2} ["ic", "e"]
{1,2} ["i", "c", "e"]
代码也类似:
function substringCombinations(str) {
if (!str.length)
return [[]];
var res = [[str.charAt(0)]];
for (var i=1; i<str.length; i++) {
var c = str.charAt(i); // for each character
for (var j=0, l=res.length; j<l; j++) {
// either generate a new substring
res.push(res[j].concat([c]));
// or add it to the last substring
res[j][res[j].length-1] += c;
}
}
return res;
}
> function substringCombinations("ice")
[["ice"],
["i","ce"],
["ic","e"],
["i","c","e"]]
答案 1 :(得分:0)
我可以建议分区号http://en.wikipedia.org/wiki/Partition_%28number_theory%29吗?
您将此问题视为将表示子字符串长度的数字相加以等于原始字符串长度的方法。
例如&#34; ice&#34; = 3,问题的解决方案就是:
3 =
3 ("ice")
2 + 1 (["ic", "e"])
1 + 2 (["i", "ce"])
1 + 1 + 1 (["i", "c", "e"])
请注意,wiki条目将组合视为与顺序无关,因此您的部分答案还取决于为每个组合生成排列。还要注意这个爆炸的速度有多快。