题目链接:
JZ27 字符串的排列
本题思路:
import java.util.*;
public class Solution {
// 结果顺序不同也算错
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
char[] c = str.toCharArray();
boolean[] visited = new boolean[c.length];
StringBuilder sb = new StringBuilder();
dfs(c, visited, sb);
return res;
}
// 回溯法(走不通就退回再走)
public void dfs(char[] c, boolean[] visited, StringBuilder sb) {
// 动态字符串sb长度与原始str长度相同
if(sb.length() == c.length) {
res.add(new String(sb)); // 就添加到结果列表
}
// 原始str非空 c.length != null
for(int i = 0; i < c.length; i++) {
if(!visited[i]) {
if(i > 0 && c[i] == c[i-1] && visited[i-1]) continue; // 剪枝 去掉重复项
sb.append(c[i]);
visited[i] = true;
dfs(c, visited, sb);
sb.deleteCharAt(sb.length() - 1); // 走不通就退回再走
visited[i] = false;;
}
}
}
}