劍指Offer 字串的排列

2021-09-28 20:47:32 字數 1523 閱讀 5982

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

輸入描述:輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

無重複的字元全排列直接用遞迴就行,重點處理重複的字元。

例如有abb,第乙個數與後面兩個數交換得bab,bba。 然後abb中第二個數和第三個數相同,就不用交換了。 接著對於bab,第二個數和第三個數不同,交換的結果是bba(因為是一條路往下遞迴,此時前面的bba還沒出現,沒有衝突)。但是接著就出現bba,此時就和前面有重複了。因此,僅僅簡單判斷是行不通的。

結論:只要在交換之前判斷 [初始點,當前點) 之間沒有和當前點重複的字元就可以交換。比如上面的初始的abb要交換a和第二個b,但是發現這兩個字元之間還有乙個b,和當前字元b重複了,就不交換。

class

solution

allpermutation

(str,0)

;sort

(result.

begin()

, result.

end())

;// 要排好序

return result;

}// 判斷 [begin,end) 之間有沒有和end相等的字元

bool

isswap

(string str,

int begin,

int end)

}return

true;}

// 遞迴全排列

void

allpermutation

(string str,

int begin)

for(

int i = begin; i < str.

size()

; i++)}

}private

: vector result;

};

class

solution

permutationcore

(str,0)

;sort

(result.

begin()

, result.

end())

;// 要排好序

return result;

}void

permutationcore

(string str,

int begin)

for(

int i = begin; i < str.

length()

; i++

)// 位置交換

swap

(str[begin]

, str[i]);

// 遞迴呼叫

permutationcore

(str, begin +1)

;}}private

: vector result;

};

劍指Offer 字串排列

題目描述 輸入乙個字串,列印出該字串中字元的所有排列。解析 step 1 求所有可能出現第乙個位置的字元。把第乙個字元與後面的每個字元交換。step 2 固定第乙個字元,將後面的字元利用遞迴進行全排列。include include using namespace std void stringpe...

劍指offer 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c 所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。解題思路 深度搜尋,在每層搜尋裡設定乙個a陣列對映所有字元,每個字元在這層迴圈中只能使用一次,避免重...

劍指offer 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。分析 經典問題。記住吧。class ...