剑指offer38 字符串排列

90 阅读1分钟

这道题是一道简单的回朔算法题,其中一步优化就是判断同一层是否访问过元素,如果重复,就没必要再继续遍历该重复元素,可以节省大量时间。

原题: image.png

思路:

image.png

代码:

class Solution {
    private List<String> res = new LinkedList<>();
    public String[] permutation(String s) {
        recur(s,new StringBuilder(),new LinkedList<Integer>());
        String[] ans = new String[res.size()];
        int idx = 0;
        for (String str : res) ans[idx++] = str;
        return ans;
    }

    public void recur(String s,StringBuilder sb,List<Integer> visited){
        if(sb.length()==s.length()){
            res.add(sb.toString());
            return;
        }
        //同一层如果重复元素,就不要再探索
        HashSet<Character> set = new HashSet<>(); 
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(visited.contains(i)) continue;
            if(set.contains(c)) continue;
            set.add(c);
            sb.append(c);
            visited.add(i);
            recur(s,sb,visited);
            sb.deleteCharAt(sb.length()-1);
            visited.remove(visited.size()-1);
        }
    }
}