《劍指 Offer》——27、字串的排列
阿新 • • 發佈:2021-01-19
技術標籤:# 《劍指 Offer》演算法題
1. 本題知識點
字串、動態規劃
2. 題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串 abc,則按字典序打印出由字元 a,b,c 所能排列出來的所有字串 abc,acb,bac,bca,cab 和 cba。
3. 解題思路
要求字串的全排列,可以看成兩步:
- 求所有可能出現在第一個位置的字元,即把第一個字元與後面的字元依次交換。
- 固定這個字元,求後面所有字元的排列。
顯然這是典型的遞迴思路,遞迴出口就是對最後一個字元固定的時候。
4. 程式碼
public class Solution {
ArrayList< String> result = new ArrayList<>();
/**
* 返回字串的全排序結果
* @param str
* @return
*/
public ArrayList<String> permutation(String str) {
// 字串為空時
if (str == null || str.length() == 0) {
return result;
}
permutation(str.toCharArray (), 0);
// 從小到大排序
Collections.sort(result);
return result;
}
public void permutation(char[] str, int begin) {
// 對最後一個字元固定的時候,退出遞迴
if (begin == str.length - 1) {
// 去重
String s = String.valueOf(str);
if (!result.contains(s) ) {
result.add(s);
}
} else {
for (int i = begin; i < str.length; i++) {
// 求所有可能出現在第一個位置的字元
swap(str, begin, i);
// 求後面所有字元的排列
permutation(str, begin + 1);
// 還原
swap(str, begin, i);
}
}
}
public void swap(char[] str, int i, int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}