给定长度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);
}
}
}
这似乎只是在进行排列,而不是我想要的...... 提前谢谢你:)
答案 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);
}
为什么要打印一个空字符串?它什么都不打印。您可能需要打印消息并退出功能。