解题思路
bfs加回溯,需要判断是否有重复
代码
class Solution {
List<List<Integer>> ans;
public List<List<Integer>> permuteUnique(int[] nums) {
ans = new ArrayList<>();
boolean[] visited = new boolean[nums.length];
LinkedList<Integer> tem = new LinkedList<>();
backtrack(nums,visited,tem);
return ans;
}
public void backtrack(int[] nums,boolean[] visted,LinkedList<Integer> tem){
if (tem.size()==nums.length){//符合要求
if (!judge(tem)) ans.add(new ArrayList<>(tem));//无重复
return;
}
for (int i=0;i<visted.length;i++){
if (visted[i]) continue;
visted[i]=true;
tem.add(nums[i]);
backtrack(nums, visted, tem);
visted[i]=false;//回溯
tem.removeLast();
}
}
public boolean judge(LinkedList<Integer> tem){//用来检查ans中是否有重复的子串
for (int i=0;i<ans.size();i++){
List<Integer> list = ans.get(i);
boolean flag = true;
for (int j=0;j<list.size();j++){
if (list.get(j)!=tem.get(j)){
flag=false;
break;
}
}
if (flag) return true;
}
return false;
}
}