一尘不染

给定长度和一组字符,如何获得所有可能的字符串组合

algorithm

给定一个长度n=4, 和a set ofcharacters->{'a','b'},如何编写一些Java代码来产生所有长度为n的字符串,其中包含集合中的字符?

对于上面的示例,结果应具有2 ^ 4 = 16个字符串,即:

aaaa
aaab
aabb
abbb
baaa
baab
babb
bbbb
bbaa
bbab
bbba
abaa
abab
abba
baba
aaba

这是我的代码段:

public void process(String result, String string)
{
    if(string.length() == 0)
    {
        System.out.println(result);
    }else{
        for(int i = 0; i < string.length(); i++)
        {
            String newResult = new String(result+string.charAt(i));
            String newString = new String(string.substring(0,i) + string.substring(i+1, string.length()));
            process(newResult, newString);
        }
    }
}

好像只是在做排列,而不是我想要的。……预先谢谢:)


阅读 186

收藏
2020-07-28

共1个答案

一尘不染

以与计数相同的方式来考虑它。从技术上讲,您是从aaaa到bbbb进行“计数”,就像二进制一样。

aaaa -> 0000
aaab -> 0001
aaba -> 0010
aabb -> 0011
...
bbbb -> 1111

没有看到您尝试过的内容,我不能为您提供更多帮助,但是从本质上讲,您需要通过对它们进行计数来枚举“最低”元素和“最高”元素之间的所有“数字”。

对于较高的元素计数,只需将您的计数视为在较高的基数中计数即可。对于八个元素Set = {a,b,c,d,e,f,g,h},您将在本质上是八进制的计数:

aaaa -> 0000
aaab -> 0001
...
aaah -> 0007
aaba -> 0010
...
hhhh -> 7777

通过从0000到9999的计数,您可以枚举长度为4的0-9的所有组合。

编辑:

感谢您发布代码。您是正确的,您正在做排列。更好的方法是使用类似于此处讨论的多重组合(在有序组合集中具有重复元素的组合)算法。

2020-07-28