剣はオファー38を指します。文字列の配置
タイトル説明
問題解決のアイデア
-
aabの完全な順列など、resには完全な順列が繰り返される可能性があるため、繰り返しが発生するため、resはHashSetを使用して重複を削除する必要があります。
-
文字列のバックトラックが発生し、containsの関数を実装する必要がある場合(つまり、文字への繰り返しアクセスを防ぐため)、visited配列を使用してvisitをマークできます。
-
文字列配列ArrayList(またはLinkedList、HashSetなど)を文字列配列に変換する方法:
ArrayList<String> src = new ArrayList<String>(); String[] target = src.toArray(new String[src.size()])
-
Stringのlengthメソッドは
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;
}
}
}