Java 使用排列查找字符串中所有可能的组合

Java 使用排列查找字符串中所有可能的组合,java,android,algorithm,permutation,powerset,Java,Android,Algorithm,Permutation,Powerset,我目前有两种方法,它们使用递归给出给定字符串的所有可能组合,我是借助于这个方法得到的。因此,如果我输入字符串,它将返回以下组合: and adn dan dna nad nda 但是,我希望它返回该字符串中剩余的1/2个字母的所有可能组合,如下所示: a n d an ad na nd etc... 该答案还提到并链接了a、b、c的所有可能子集: 正如你所看到的,它不会前后组合,比如 c,b,a c,a,b c,a .... 下面是我想要实现的当前代码: public void pe

我目前有两种方法,它们使用递归给出给定
字符串的所有可能组合,我是借助于这个方法得到的。因此,如果我输入
字符串
,它将返回以下组合:

and
adn
dan
dna
nad
nda
但是,我希望它返回该字符串中剩余的1/2个字母的所有可能组合,如下所示:

a
n
d
an
ad 
na
nd
etc...

该答案还提到并链接了a、b、c的所有可能子集:

正如你所看到的,它不会前后组合,比如

c,b,a
c,a,b
c,a
....
下面是我想要实现的当前代码:

public void permutation(String str) {

  permutation("", str);
}

private void permutation(String prefix, String str) {

    int n = str.length();
    if (n == 0) myList.add(prefix);
    else {
        for (int i = 0; i < n; i++)

            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));

    }
}
public void置换(String str){
排列(“,str);
}
私有void置换(字符串前缀、字符串str){
int n=str.length();
如果(n==0)myList.add(前缀);
否则{
对于(int i=0;i
您提供的此语句仅在排列了
str
中的所有可用字符时添加

如果删除
If(n==0)
,它会将
a
an
的所有前缀添加到
,因此您可以使用:

private void permutation(String prefix, String str) {
    int n = str.length();
    myList.add(prefix);
    if(n > 0) {
        for (int i = 0; i < n; i++)
            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));

    }
private void置换(字符串前缀,字符串str){
int n=str.length();
myList.add(前缀);
如果(n>0){
对于(int i=0;i

由于递归,您显然会得到一堆重复项,并且可能会得到一个空字符串,但是您可以使用一个不允许重复项的
集合,或者您可以在添加之前检查它是否是重复项。我将把优化留给您。

Powerset不会返回您想要的内容。这是因为集合
{a,b,c}
等同于
{b,a,c}
以及您想要的其他集合


你可以修改你的算法来从每一个集合中创建所有可能的排列。这将给你一些重复,所以你可以把它们存储在集合中。

< P>一个考虑这个问题的方法是考虑给定集合的所有二元组合。< /P> 例如,如果所讨论的集合是{a,b,c},那么所有的二进制组合(2^3=8)都是:

一旦构建了这些集合,就可以使用递归来获得每个集合的组合。

公共类Stringpermutations{
public class Stringpermutations {
    public static void main(String[] args) {
        permutations(0,"123");
    }

    public static void permutations(int start, String s) {
        char[] chr=s.toCharArray();
        if(start==s.length()) {
            System.out.println(s);
        }
        for(int i=start;i<s.length();i++) {
            char c=chr[i];
            chr[i]=chr[start];
            chr[start]=c;
            permutations(start+1,new String(chr));
        } 
    }
}
公共静态void main(字符串[]args){ 置换(0,“123”); } 公共静态无效置换(整数开始,字符串s){ char[]chr=s.toCharArray(); 如果(开始==s.length()){ 系统输出打印项次; }
对于(int i=start;IOW。这是一个很简单的解决方案,干杯,伙计。即使没有重复项,也能按照我的要求进行测试和工作。几分钟后我会接受答案。你只提供组合,他也需要排列。对于每一个组合,这是一个很好的方法,顺便说一句,他需要排列其中的每一个。@Grayson我提到过递归可以在每个组合上使用。@Michael Markidis我现在明白了。我喜欢二进制方法。我在各种解决方案中使用过它。为什么动力集会给出重复的方法?问题是如果我们传递字符串s=“AAA”;从下面出来,AAA需要这个senario的帮助
000 = {}
001 = {c}
010 = {b}
011 = {b,c}
100 = {a}
101 = {a, c}
110 = {a, b}
111 = {a, b, c}
public class Stringpermutations {
    public static void main(String[] args) {
        permutations(0,"123");
    }

    public static void permutations(int start, String s) {
        char[] chr=s.toCharArray();
        if(start==s.length()) {
            System.out.println(s);
        }
        for(int i=start;i<s.length();i++) {
            char c=chr[i];
            chr[i]=chr[start];
            chr[start]=c;
            permutations(start+1,new String(chr));
        } 
    }
}