思路
回溯法

時間復雜度O(n!),空間復雜度O(n)。
代碼
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
private ArrayList<String> list = new ArrayList<String>();
private void swap(char[] s, int a, int b) {
char t = s[a];
s[a] = s[b];
s[b] = t;
}
private void helper(char[] str, int k) {
if(k == str.length - 1) {
String s = String.valueOf(str);
if(!list.contains(s)) {
list.add(s);
}
} else {
// 跟自身交換是最小的子問題
for(int i = k; i < str.length; i++) {
swap(str, i, k);
// k代表圖中的層數
helper(str, k+1);
// 回溯
swap(str, i, k);
}
}
}
public ArrayList<String> Permutation(String str) {
if(str != null && str.length() != 0) {
helper(str.toCharArray(), 0);
Collections.sort(list);
}
return list;
}
}
筆記
-
回溯法比較容易想到,問題在於怎么實現從最小子問題回溯,即怎么從倒數兩個開始交換(如何到達遞歸樹底層)。
這時思路中的圖就比較重要,需要理清遞歸樹如何分層的(k的意義)。 -
先排序無效,圖中cba在cab之前。
