如何将字符串的所有可能排列放入数组中?

时间:2014-12-03 05:57:35

标签: java arrays algorithm

所以我使用经典的排列算法

private static void permutation(String prefix, String str) {
    int n = str.length();
    if (n == 0) System.out.println(prefix);
    else {
        for (int i = 0; i < n; i++)
            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
    }
} 

我唯一无法弄清楚如何将排列存储到数组中而不是仅仅打印出来。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

试试这个方法。这将返回排列列表

private static List<String> permutation(String prefix, String str) {
    List<String> permutations = new ArrayList<>();
    int n = str.length();
    if (n == 0) {
        permutations.add(prefix);
    }
    else {
        for (int i = 0; i < n; i++)
            permutations.addAll(permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n)));
    }
    return permutations;
}

使用数组。需要JAVA 8

private static String[] permutation(String prefix, String str) {
    String[] permutation = new String[]{};
    int n = str.length();
    if (n == 0) {
        permutation = new String[]{prefix};
    }
    else {
        for (int i = 0; i < n; i++)
            permutation = Stream.concat(Arrays.stream(permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n))),
                    Arrays.stream(permutation)).toArray(String[]::new);

    }
    return permutation;
}

答案 1 :(得分:0)

您也可以将排列列表的引用传递给置换方法本身。这样做的好处是只创建一个列表。

private static List<String> permutation(String str) {
  List<String> perms = new ArrayList<>();
  permutation("", str, perms);

  return perms;
}

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

List<String> perms = permutation("abcd");