【问题标题】:Generate all permutations of string in some range在某个范围内生成字符串的所有排列
【发布时间】:2016-03-08 12:44:55
【问题描述】:

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

这是一个例子。

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

【问题讨论】:

  • 你试过了吗?
  • 你的意思不是排列,是吗?完全不清楚,你真正想要做什么。
  • 把它想象成计数,每个数字都是一个字母。
  • 所有字符串的长度是否相同?如果是这样,那么您所要做的就是从十进制到基础 a 的基本转换,其中 a 是字母表中的字符数,正如@Martin 所说,开始数数。

标签: java string algorithm permutation


【解决方案1】:

无论你做什么,你的解决方案都会效率低下。

我会写一个'next'函数来增加字符串的最后一个(最右边的)字符。如果它已经与“结束字符”匹配,我会将其设置为“开始字符”,然后使用剩余字符(字符 0 到 n-1)递归调用该方法。然后您将触摸所有可能的值。

(如果 aaa..bbb 应该包含 azz,则此算法不起作用,因为它将在 aaa 和 bbb 之间按字母顺序排序。)

【讨论】:

  • 是的,如果范围是aaa-ccc,我不需要包含zz,请您提供示例
【解决方案2】:

这是基于 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;

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多