【剑指 Offer 38】字符串的排列

题目

题目链接
输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的长度 <= 8

解题思路

全排列问题
回溯思想,考虑到如果输入字符串中包含重复元素,要求结果中不能有重复元素,所以这里用到了set集合去重。

为了方便理解,这里抽象成递归树。

在这里插入图片描述

代码

class Solution {
    public String[] permutation(String s) {
        if (s == null) {
            return new String[]{};
        }
        char[] sChars = s.toCharArray();
        int[] visited = new int[sChars.length];
        StringBuilder sb = new StringBuilder();
        Set<String> answer = new HashSet<>();
        backstracking(sChars, visited, sb, answer);
        String[] solve = solve(answer);
        return solve;
    }

    public void backstracking(char[] sChars, int[] visited, StringBuilder sb, Set<String> answer) {
        if (sb.length() == sChars.length) {
            answer.add(sb.toString());
            return;
        }
        for (int i = 0; i < sChars.length; i++) {
            if (visited[i] == 1) {
                continue;
            }
            visited[i] = 1;
            sb.append(sChars[i]);
            backstracking(sChars, visited, sb, answer);
            visited[i] = 0;
            sb.deleteCharAt(sb.length() - 1);
        }
    }

    public String[] solve(Set<String> list) {
        String[] answer = new String[list.size()];
        int n = 0;
        for (String s : list) {
            answer[n] = s;
            n++;
        }
        return answer;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35416214/article/details/107554894