题目:字符串排列
思路:回溯。
注意对于重复的剪枝:如果某个元素与前一个元素相同,并且前一个元素没有被访问,说明二者在同一层,需要剪枝。
代码:
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<>();
char[] array = str.toCharArray();
boolean[] visited = new boolean[array.length];
StringBuilder stringbuilder = new StringBuilder();
backtrack(res, array, visited, stringbuilder, array.length);
return res;
}
public void backtrack(ArrayList<String> res, char[] array, boolean[] visited, StringBuilder stringbuilder, int n) {
if (stringbuilder.length() == n) {
res.add(stringbuilder.toString());
}
for (int i = 0; i < n; i ++) {
if (visited[i] || (i > 0 && array[i] == array[i - 1]) && !visited[i - 1]) {
continue;
}
stringbuilder.append(array[i]);
visited[i] = true;
backtrack(res, array, visited, stringbuilder, n);
stringbuilder.deleteCharAt(stringbuilder.length() - 1);
visited[i] = false;
}
}
}