我正在寻找生成范围内所有字符串排列的最佳方法。
下面是一个示例。
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
您的解决方案需要效率低下才能运行您所做的任何事情。
我会写一个"next"函数来递增字符串的最后一个(最右边)字符。如果它已经与"结束字符"匹配,我会将其设置为"起始字符",然后递归调用包含剩余字符(字符 0 到 n-1)的方法。然后,您将触摸所有可能的值。
(如果你aaa,这个算法不起作用。BBB 应该包括 Azz,因为它将按字母顺序在 AAA 和 BBB 之间排序。
下面是一个基于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;