Day 18

zhanglei 2022年08月09日 490次浏览

Day 18

剑指offer 38.字符串的排列

题目描述

image-20220809095541994

思路–回溯

解答

class Solution {
    
    /**
        该题类似于 全排列2,本题使用set来去除重复元素
        除了使用set去重外,还可以对数组进行排序,使用visited数组进行剪枝!

    */
    Set<String> res = new HashSet();
    public String[] permutation(String s) {

        backtrack(s.toCharArray(),new StringBuilder(), new boolean[s.length()]);
        return res.toArray(new String[0]); 

    }
    
    // 回溯函数
    public void backtrack(char[] ch,StringBuilder sb, boolean[] visitid){
        // 终止条件
        if(sb.length() == ch.length){
            res.add(sb.toString());
            return;
        }
        // 选择列表
        for(int i = 0; i < ch.length; i++){
            // 剪枝,如果当前位置的元素已经使用过,则跳过进入下一个位置
            if(visitid[i]) continue;
            // 做出选择
            sb.append(ch[i]);
            // 更新标记
            visitid[i] = true;
            // 进入下层回溯
            backtrack(ch,sb,visitid);
            // 撤销选择
            sb.deleteCharAt(sb.length()-1);
            visitid[i] = false;
            
        }
    }
}