【问题标题】:Java permutation of String arrayString数组的Java排列
【发布时间】:2018-02-12 13:14:27
【问题描述】:

我正在尝试找到将字符串数组与两个元素组合的所有可能选项。假设数组有两个元素 {"we","are"}。输出应该是:"we" "are" "we are" "are we" 我可以通过一些搜索来整理这段代码:

public class Main {

public static void main(String[] args) {

    String[] strings = {"we", "are"};

    final int maxbit = 1 << strings.length;

    for (int p = 0; p < maxbit; p++) {
        String finalString = "";
        for (int i = 0; i < strings.length; i++) {
            if ((1 << i & p) > 0) {
                finalString += strings[i] + " ";
            }
        }
        System.out.println(finalString);
    }

}

我的问题是,我缺少一个解决方案,输出如下:“我们”“是”“我们是”。 所以我错过了“我们是”选项,我需要使用递归来解决这个问题还是可以修改这段代码以显示剩余的选项?

更新:在答案的帮助下找到解决方案

public static void main(String[] args) {
    String[] test = { "are", "we"};
    language(test.length, test, "");
}

private static void language(final int n, final String[] syllables, final String currentWord) { // example of N = 3
    if (n == 0) {
        System.out.println(currentWord);
    } else {
        for (int i = 0; i < syllables.length; i++) {
            if (currentWord.equals(syllables[i])){
                language(n - 1, syllables, "" + syllables[i]);
            }else{
                language(n - 1, syllables, currentWord + syllables[i]);
            }
        }
    }
}

【问题讨论】:

  • {"we"}{are} 不是{"we", "are}排列。排列的大小始终与源数组相同。
  • 所以我理解错了,不是排列吗?如果需要这个输出,这会叫什么?
  • 我认为您正在寻找所有可能的子集。
  • 一种方法是:1)只做排列。 IE。将 所有 数组元素排列在一起。对于 2 大小的数组,只有 2 个排列。 2) 之后,您可以构建源数组的所有可能子集,然后排列所有这些子集。这将导致一个通用程序,我猜这将需要更多的循环和/或递归。
  • 对我来说,使用位移等操作看起来有点复杂,尤其是对于像你这样经验很少的人来说。我可能会选择一个递归选项,该选项采用集合中的其余元素之一或不采用(从而创建较短的子集)。

标签: java permutation


【解决方案1】:

我看了一会儿,根据你的代码找到了两种方法:

这将打印出每个排列一次,并且不必包含所有单词:

public static void recPerm(String... input) {
    recHelper(input, input.length, "");
}

private static void recHelper(String[] input, int length, String currentWord) {
    if (currentWord != "")
        System.out.println(currentWord);
    for (int i = 0; i < input.length; i++) {
        if (!currentWord.contains(input[i]))
            recHelper(input, length - 1, currentWord + input[i]);
    }
}

这将打印出每个排列一次,并且必须包含所有单词:

public static void maxRecPerm(String... input) {
    maxRecHelper(input, input.length, "");
}

private static void maxRecHelper(String[] input, int length, String currentWord) {
    if (length == 0)
        System.out.println(currentWord);
    for (int i = 0; i < input.length; i++) {
        if (!currentWord.contains(input[i]))
            maxRecHelper(input, length - 1, currentWord + input[i]);
    }
}

【讨论】:

    【解决方案2】:

    另一个例子

    import java.util.Arrays;
    public class HelloWorld{
    
        public static void main(String[] args) {
            String[] strings = {"we", "are"};
            
            String str = Arrays.toString(strings);
            
            System.out.println("Java String array to String = "+str.replace(",","").replace("[","").replace("]",""));
        }
    }
    

    【讨论】:

    • 您可以使用正则表达式更好地替换
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 2013-08-26
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多