面试题 08.08. 有重复字符串的排列组合-----回溯法

题目表述

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

示例:
示例1:

输入:S = "qqe"
输出:["eqq","qeq","qqe"]

回溯法

这题主要需要考虑去重问题,去重包括枝去重和层去重
支去重:visited或used数组去重
层去重:
①i>0 && visited[i-1]false && nums[i]nums[i-1] 利用visitted[i-1]=false;
②i > beginIndex&&nums[i]==nums[i-1], i>beginIndex说明是同一层里有重复的
③利用Hash(set或数组或map)

class Solution {
    Set<String> set = new HashSet<>();
    public String[] permutation(String S) {
        int n = S.length();
        char[] ch = S.toCharArray();
        boolean[] visited = new boolean[ch.length];
        dfs(ch, 0, visited, new StringBuilder());
        String[] ans = new String[set.size()];
        int i = 0;
        for(String s : set){
            ans[i++] = s;
        }
        return ans;
    }
    public void dfs(char[] ch, int depth, boolean[] visited, StringBuilder str){
        if(depth == ch.length){
            set.add(str.toString());
        }
        for(int i = 0 ;i < ch.length;i++){
            if(visited[i]) continue;
            visited[i] = true;
            str.append(ch[i]);
            dfs(ch, depth + 1, visited, str);
            str.replace(str.length() - 1, str.length(), "");
            visited[i] = false;
        }
    }
}
posted @ 2022-06-04 22:03  YoungerWb  阅读(75)  评论(0编辑  收藏  举报