生成某个范围内字符串的所有排列



我正在寻找生成范围内所有字符串排列的最佳方法。

下面是一个示例。

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;

最新更新