1. 程式人生 > 其它 >《劍指 Offer》——27、字串的排列

《劍指 Offer》——27、字串的排列

技術標籤:# 《劍指 Offer》演算法題

1. 本題知識點

字串、動態規劃

2. 題目描述

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串 abc,則按字典序打印出由字元 a,b,c 所能排列出來的所有字串 abc,acb,bac,bca,cab 和 cba。

3. 解題思路

要求字串的全排列,可以看成兩步:

  1. 求所有可能出現在第一個位置的字元,即把第一個字元與後面的字元依次交換。
  2. 固定這個字元,求後面所有字元的排列。

顯然這是典型的遞迴思路,遞迴出口就是對最後一個字元固定的時候。

在這裡插入圖片描述

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; } }