剑指offer 38. 字符串的排列
题目描述
解题思路
-
由于 res 中有可能会出现重复的全排列,如 aab 的全排列会出现重复,所以 res 需要用 HashSet 来去重。
-
如果遇上字符串的回溯,且需要实现 contains 的功能(即防止重复访问字符),则可以用 visited 数组来标记访问。
-
将字符串数组 ArrayList(或 LinkedList、HashSet 等)转化为 String 数组的方法:
ArrayList<String> src = new ArrayList<String>(); String[] target = src.toArray(new String[src.size()])
-
String 的求长度方法是
str.length()
,而不是str.size()
class Solution {
Set<String> res = new HashSet<>();
public String[] permutation(String s) {
String track = ""; //记录路径
boolean[] visited = new boolean[s.length()]; //防止重复访问字符
char[] str = s.toCharArray();
backtrack(str, track, visited);
//将字符串数组ArrayList转化为String类型数组
return res.toArray(new String[res.size()]);
}
public void backtrack(char[] str, String track, boolean[] visited) {
if (track.length() == str.length) {
res.add(new String(track));
return;
}
for (int i = 0; i < str.length; i++) {
//跳过重复字符
if (visited[i]) continue;
visited[i] = true;
backtrack(str, track + str[i], visited);
visited[i] = false;
}
}
}