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

时间:2016-03-08 12:44:55

标签: java string algorithm permutation

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

这是一个例子。

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

2 个答案:

答案 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;