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

时间:2012-09-05 19:57:28

标签: java algorithm

  

可能重复:
  Generating all permutations of a given string

给定长度n=4,set of characters -> {'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);
        }
    }
}

这似乎只是在进行排列,而不是我想要的...... 提前谢谢你:)

3 个答案:

答案 0 :(得分:7)

以与计算相同的方式来思考它。你在技术上从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计算,这与枚举0-9的所有组合的长度为4的方式相同。

修改

感谢您发布您的代码。你是对的,你在做排列。更好的方法是使用多组合(与ordererd组合集中的重复元素组合)算法,如所讨论的算法here

答案 1 :(得分:0)

这可能容易出错,因为我没有测试过,但它应该可以工作。即使它没有,它应该非常接近你想要的。请注意,第一个for循环填充resultList而不是设置值,因为没有任何内容可以追加。

如果有问题,请告诉我,我会更正。

ArrayList<String> results = new ArrayList<String>();
ArrayList<String> components = new ArrayList<String>(){"a","b","c"};
int n = 4;

int size = components.size();
for ( int j = 0; j < size; j++ )
{
  // start with size^(n-1) copies of each letter. 
  for ( int i = 0; i < Math.pow( size, n-1); i++ )
  {
    results.add( components.get( j ) );
  }
}

// At this point you have each letter in there once...

for( int depth = 1; depth < n; depth++ )
{
  for( int j = 0; j < size; j++ )
  {
    String toAppend = components.get( j );
    for( int i = j; i < results.size(); i += size )
    {
      String current = results.get( i );
      current += toAppend;
      results.set( i, current );
    }
  }
}

答案 2 :(得分:0)

你有答案,但我觉得你还需要一些帮助:

if(string.length() == 0)
{
System.out.println(result);
}

为什么要打印一个空字符串?它什么都不打印。您可能需要打印消息并退出功能。