面试题 08.08. 有重复字符串的排列组合-----回溯法
题目表述
有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。
示例:
示例1:
输入:S = "qqe"
输出:["eqq","qeq","qqe"]
回溯法
这题主要需要考虑去重问题,去重包括枝去重和层去重
支去重:visited或used数组去重
层去重:
①i>0 && visited[i-1]false && nums[i]nums[i-1] 利用visitted[i-1]=false;
②i > beginIndex&&nums[i]==nums[i-1], i>beginIndex说明是同一层里有重复的
③利用Hash(set或数组或map)
class Solution {
Set<String> set = new HashSet<>();
public String[] permutation(String S) {
int n = S.length();
char[] ch = S.toCharArray();
boolean[] visited = new boolean[ch.length];
dfs(ch, 0, visited, new StringBuilder());
String[] ans = new String[set.size()];
int i = 0;
for(String s : set){
ans[i++] = s;
}
return ans;
}
public void dfs(char[] ch, int depth, boolean[] visited, StringBuilder str){
if(depth == ch.length){
set.add(str.toString());
}
for(int i = 0 ;i < ch.length;i++){
if(visited[i]) continue;
visited[i] = true;
str.append(ch[i]);
dfs(ch, depth + 1, visited, str);
str.replace(str.length() - 1, str.length(), "");
visited[i] = false;
}
}
}