我正在寻找在一个范围内生成所有字符串排列的最佳方法。
这是一个例子。
Start : aaaa
End : cccc
或者例如
Start : aabb
End : ccaa
应为第一种情况生成的字符串
aaaa,aaab,aaac,aaba,aabb,aabc,aaca,aacb ... cccc
所以我希望你有个主意。所有可能的排列。
请建议如何有效地解决这个问题。我可以编写嵌套循环,但我希望有一些默认实现效率更高。
修改
与二进制系统中的计数相同
100
101
110
111
示例
开始:aaa
结束:ccc
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
答案 0 :(得分:1)
无论你做什么,你的解决方案都需要效率低下。
我写了一个'next'函数,它增加了字符串的最后一个(最右边)字符。如果它已经匹配'结束字符',我将它设置为'开始字符',然后递归调用该方法的剩余字符(字符0到n-1)。然后,您将触摸所有可能的值。
(如果aaa..bbb应包含azz,则该算法不起作用,因为它将按字母顺序排列在aaa和bbb之间。)
答案 1 :(得分:0)
以下是基于Jane Nicholson答案的实现:https://jsfiddle.net/3rzse24d/2/
var start = prompt("Start: (ex: aabb)");
var end = prompt("End: (ex: ccaa)");
if (start.length != end.length) {
alert("They must have the same length!");
return;
}
if (start > end) {
var tmp = start;
start = end;
end = tmp;
}
var alphabet = prompt("Alphabet: (ex: abc)");
var out = "";
var i, digit, stop;
while (start < end) {
out += start + "\n";
stop = false;
for (i = start.length - 1 ; !stop && i >= 0 ; i-- ) {
digit = alphabet.indexOf( start.charAt(i) );
if (digit < 0) {
alert("Letter `" + start.charAt(i) + "` is not part of the provided alphabet!");
return;
}
digit++;
stop = digit < alphabet.length;
start = start.substr(0, i)
+ alphabet.charAt( digit % alphabet.length )
+ start.substr( i + 1 );
}
if (!stop) break;
}
document.getElementById("out").textContent = out + end;