java 打印可能的非空字母序列数

umuewwlo  于 2023-01-24  发布在  Java
关注(0)|答案(4)|浏览(151)

我想打印一些可能的非空字母序列。

String str="ABC";

预期输出为

A,B,C
AB,AC,BC,BA,CA,CB
ABC,ACB,BAC,BCA,CAB,CBA`

但我得到下面的输出是不正确的。如何修复我的代码

BB CC A AB ACC BC ABC AC B BBC CCC BCC C CBC CB

我已经用Recurion写了下面的代码

String tiles = "ABC";
Set<String> ans = new HashSet<>();
solve(tiles, 0, "", ans);

public static void solve(String tiles, int idx, String output, Set<String> ans) {

        ans.add(output);

        if (idx >= tiles.length()) {
            return;
        }

        for (int i = idx; i < tiles.length(); i++) {

            solve(tiles, idx + 1, output + tiles.charAt(i), ans);

        }

    }

This is how recursion tree would look like for str="AAB"

mklgxw1f

mklgxw1f1#

您需要忽略输出中第一次传递的“”,然后需要忽略已经传递的每个字母

public static void main(String[] args) {
    String tiles = "ABC";
    List<String> ans = new ArrayList<>();
    solve(tiles, "", ans);
    System.out.println(ans);
}
public static void solve(String tiles, String output, List<String> ans) {
    if (!output.equals("")) ans.add(output);
    for (int i = 0; i < tiles.length(); i++) {
        String str = tiles.substring(0, i) + tiles.substring(i + 1);
        solve(str, output + tiles.charAt(i), ans);
    }
}

产出

[A, AB, ABC, AC, ACB, B, BA, BAC, BC, BCA, C, CA, CAB, CB, CBA]
ufj5ltwl

ufj5ltwl2#

你可以试试这个

public class Permutation {

    public static List<String> getPermutations(String str) {
        Set<String> permutations = new HashSet<>();
        permute(str, "", permutations);
        return new ArrayList<>(permutations);
    }

    private static void permute(String string, String prefix, Set<String> permutations) {
        if (string.length() == 0) {
            permutations.add(prefix);
        } else {
            for (int i = 0; i < string.length(); i++) {
                char charAt = string.charAt(i);
                String remainingString = string.substring(0, i) + string.substring(i + 1);
                permute(remainingString, prefix + charAt, permutations);
            }
        }
    }
}

"置换"方法有3个参数:字符串、前缀字符串和一组排列。

  • "置换"方法有3个参数:字符串、前缀字符串和一组排列。
  • 如果输入字符串不为空,它将使用for循环来循环访问输入字符串中的字符。
  • 对于每次迭代,它获取当前索引处的字符,通过从输入字符串中删除该字符来创建新字符串。

1.然后调用置换方法3次:
1.然后调用置换方法3次:
1.一个带有原始字符串和前缀的
1.一个带有其余字符串和前缀的
这样,该函数探索输入字符串中所有可能的字符排列,包括在排列中不包含任何字符的选项和位置排列,但不包括空字符串作为选项。
然后你可以这样使用:

Permutation p = new Permutation();
List<String> permutations = p.getPermutations("abc");
fjaof16o

fjaof16o3#

进行1次变更:

Set<String> ans = new TreeSet<>(Comparators.comparing(String::length).thenComparing(s -> s));
cedebl8k

cedebl8k4#

这是一个非常流行的回溯问题。你可以在这里找到几乎相同的问题:https://leetcode.com/problems/subsets/
输入的是数字而不是字符,但思路是一样的。您可以切换到解决方案选项卡,探索不同的答案:https://leetcode.com/problems/subsets/solutions/

相关问题