这道题是一道简单的回朔算法题,其中一步优化就是判断同一层是否访问过元素,如果重复,就没必要再继续遍历该重复元素,可以节省大量时间。
原题:
思路:
代码:
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);
}
}
}