JAVA练习177-有重复字符串的排列组合

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

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

示例2:
 输入:S = "ab"
 输出:["ab", "ba"]

提示:

  1. 字符都是英文字母。
  2. 字符串长度在[1, 9]之间。

分析:

方法:DFS+回溯

解题思路同上一题 JAVA练习176-无重复字符串的排列组合_什巳的博客-CSDN博客 ,不同点在于字符串中的字符可能重复,因此我们可以定义一个 HashSet 来去重,有重复时就不交换。

时间复杂度:O(n*n!) 
空间复杂度:O(n^2)

class Solution {

    //创建字符数组
    char[] cs;
    //字符串长度
    int len;
    //结果集
    List res = new ArrayList<>();

    public String[] permutation(String S) {
        //转化为字符数组
        cs = S.toCharArray();
        //长度
        len = cs.length;
        //深度遍历
        dfs(0);
        //返回结果集转化的数组
        return res.toArray(new String[0]);
    }

    public void dfs(int n){
        //遍历到最后一个,不用交换
        if(n == len-1){
            //添加到结果集
            res.add(String.valueOf(cs));
            return;
        }
        //防重复集合
        HashSet set = new HashSet<>();
        //遍历,进行交换和深度遍历
        for(int i = n; i < len; ++i){
            //未重复就交换
            if(!set.contains(cs[i])){
                //交换
                swap(i, n);
                //深度遍历
                dfs(n+1);
                //复原
                swap(i, n);
                //添加交换过的字符,防止重复交换
                set.add(cs[i]);
            }
        }
    }

    //交换
    public void swap(int i, int j){
        char temp = cs[i];
        cs[i] = cs[j];
        cs[j] = temp;
    }
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-ii-lcci

你可能感兴趣的:(Java练习,java,leetcode,深度优先,dfs,算法)