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

可能重复:
生成给定字符串的所有排列

给定长度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); } } } 

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

以你计算的方式来思考它。 你在技术上从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 

这与枚举0-9的所有组合的长度为4的方式相同,从0000到9999计数。

编辑:

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

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

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

 ArrayList results = new ArrayList(); ArrayList components = new ArrayList(){"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 ); } } } 

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

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

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