

求解代码
java
ArrayList<String> ans = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
StringBuilder sb = new StringBuilder();
boolean[] used = new boolean[str.length()];
char[] chs = str.toCharArray();
Arrays.sort(chs);
str = new String(chs);
backtrack(str, sb, used);
return ans;
}
private void backtrack(String str, StringBuilder sb, boolean[] used) {
if (sb.length() == str.length()) {
ans.add(new String(sb));
return;
}
for (int i = 0; i < str.length(); i++) {
if (used[i]) {
continue;
}
if (i > 0 && str.charAt(i) == str.charAt(i - 1) && !used[i - 1]) {
continue;
}
sb.append(str.charAt(i));
used[i] = true;
backtrack(str, sb, used);
sb.deleteCharAt(sb.length() - 1);
used[i] = false;
}
}
小贴士
这道题本质上跟【回溯】有重复项数字的全排列是一样的,都是【有重复项数字的全排列问题】,只不过从普通的数组环境迁移到了字符串环境,其实字符串本质上也是数组,字符数组嘛。