Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定一个长度和一组字符,如何获得所有可能的字符串组合_Java_Algorithm - Fatal编程技术网

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

Java 给定一个长度和一组字符,如何获得所有可能的字符串组合,java,algorithm,Java,Algorithm,可能重复: 给定长度n=4, 和字符集->{'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(stri

可能重复:

给定长度
n=4,
字符集->{'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);
        }
    }
}
公共作废过程(字符串结果、字符串)
{
if(string.length()==0)
{
系统输出打印项次(结果);
}否则{
对于(int i=0;i
这似乎只是做排列,而不是我想要的。。。。。。。
提前谢谢:)

用你计算的方法来思考。从技术上讲,你是在从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的所有组合的方式相同

编辑:


谢谢你发布你的代码。你是对的,你在做排列。一个更好的方法是使用一个多组合(与orderd组合集中的重复元素组合)算法,就像前面讨论的那样。

这可能容易出错,因为我还没有测试过它,但它应该可以工作。即使没有,它也应该非常接近你想要的。请注意,第一个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 );
    }
  }
}
ArrayList结果=新建ArrayList();
ArrayList components=新的ArrayList(){“a”、“b”、“c”};
int n=4;
int size=components.size();
对于(int j=0;j
您已经得到了答案,但我觉得您需要更多的帮助:

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

为什么要打印空字符串?它根本不会打印任何东西。您可能希望打印一条消息并退出函数。

@Matteo我尝试使用字符串排列中的类似代码,但未能获得正确的结果…请先转到理论:user1182328请向我们显示您的代码并告诉我们您检测到的错误,以便我们可以帮助您。顺便说一句,这些不是排列,我认为它们是重复的变体。排列是指当你有几个distint元素,并且你必须对它们进行排序,而不重复任何元素(最多你可以有几个相同的元素),我不确定这种二进制可视化是否有助于解决一个可能在允许的集合中包含两个以上字符的问题。@DuncanJones无论如何,它是相同的,如果你有n个不同的元素,你就在base-n中写“数字”。@DuncanJones当然有,只要把这个概念扩展到更高的基数,比如base-8代表8个元素。@DuncanJones我更新了答案,以澄清更高的问题bases@Brian我的评论主要围绕着这种可视化(无论基础如何)是否有助于解决问题。但我想这是我的自以为是,因为不是每个人的思维都是一样的!我认为+1投票表明我是少数:-)应该注意的是,我更喜欢另一个答案,但直到我发布了这个答案,我才看到它……他检查
字符串的长度是否为
0
,然后打印
结果,而不是
字符串,所以这是不正确的。