1. 程式人生 > 實用技巧 >字串全排列的輸出(遞迴解法)

字串全排列的輸出(遞迴解法)

題目描述

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

輸入描述:

輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
示例1

輸入

"ab"

返回值

["ab","ba"]


題目如上,其實這是一道水題,但是好像做題的時候思路不對上就容易走火入魔,原本打算用dp做出來。。奈何不太熟不知道從何dp,於是看了下官方題解,把這個思路記錄下來。

在原始字串上進行操作的話,就不用擔心漏了字元和字元重複什麼的問題,用set暫存結果可以過濾多餘的字串結果。

思路大致這樣,對目標string每兩個字元進行一次換位,中間遞迴其他字元的交換,同時在得到一次結果之後回溯,因為換位之後其他分支的結果需要原來的字串嘛,這樣才能保證
結果比較全面,接下來是附帶註解的程式碼。

class Solution {
public:
    vector<string> Permutation(string str) {//遞迴解法
        if(str.empty())return {};//字串為空直接返回空結果
        set<string> st;//字典可以過濾多餘結果
        change(0,str,st);
        return vector<string>({st.begin(),st.end()});//型別轉換  
    }
    void change(int position,string s,set
<string> &st){ for(int i=position;i<s.length();i++){//這裡i=position 是防止漏了原始字串的結果 swap(s[position],s[i]); change(position+1,s,st);//遞迴其他部分的字串 st.insert(s);//結果記錄 swap(s[position], s[i]);//回溯 } } };

又水了一份題解。