思路
与Permutation的思路类似,使用与subsets II相同的去重思路。DFS搜索。
时间复杂度O(n!)
空间复杂度O(n)
代码
public class Solution {
/**
* @param str: A string
* @return: all permutations
*/
public List<String> stringPermutation2(String str) {
// write your code here
List<String> results = new ArrayList<>();
if (str == null) {
return results;
}
char[] strArray = str.toCharArray();
boolean[] visit = new boolean[str.length()];
Arrays.sort(strArray);
dfs(strArray, visit, new StringBuilder(), results);
return results;
}
private void dfs(char[] str, boolean[] visit,
StringBuilder cur, List<String> results) {
if (cur.length() == str.length) {
results.add(cur.toString());
return;
}
for (int i = 0; i < str.length; i++) {
if (visit[i]) {
continue;
}
if (i > 0 && str[i] == str[i - 1] && !visit[i - 1]) {
continue;
}
cur.append(str[i]);
visit[i] = true;
dfs(str, visit, cur, results);
cur.deleteCharAt(cur.length() - 1);
visit[i] = false;
}
}
}