劍指offer二十七 字串的排列

2022-08-14 05:57:15 字數 1675 閱讀 4744

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

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

先簡化問題假設這n個字元不重複

大問題 n個字元全排列  =》  讓n個字元依次做第乙個字元,每次固定後  +   後n-1個字元全排列

舉例:abc排列  =》  固定a  bc排列   、  固定b    ac排列  、 固定c  ba排列

基線條件(遞迴結束條件): n個字元都排好了

遞迴條件(遞迴繼續條件): 排好的字元個數小於n

遞迴體:    for(int i = start;i++;i<=n)  

注:固定start,讓n個字元依次做第乙個字元,通過和第乙個字元交換位置來實void swap(char &a, char &b)

void pailie(char a, int start, int len, vector &result)

for (int i = start; i < len; i++) }

然後進一步考慮重複字元的情況,按上面的思路處理,

例如  abb   =》 1固定a 排bb   、2固定b 排b  ab、3固定  b 排ba

aab   =》 1固定a 排ab    2固定a 排 ab    3固定b  排aa 

可見 問題一:abb    2、3重複,其原因是a與相同元素交換了2次,

問題二:aab   1、2重複,原因是a與另乙個a交換了,其後n-1個元素相同

綜上,依次讓n個字元做第乙個字元,不能重複。

遞迴體做如下變換:

for(int i = start;i++;i<=n)

#include#include

#include

#include

#include

using

namespace

std;

class

solution

void pailie(char a, int start, int len, vector &result)

set

for (int i = start; i < len; i++)

}}vector

permutation(string

str)

};

abc的答案 abc、acb、bac、bca、cab、cba;知道abc能否推知下乙個排序呢?

字典序法就是這樣,按規律推出下一中排列的可能。

字典序演算法的步驟如下:

1、從原排列中,從右至左,找到第乙個左鄰小於右鄰的字元,記左鄰位置為 a。

2、重新從右至做,找到第乙個比 list[a] 大的字元,記為位置為 b。

3、交換 a 和 b 兩個位置的值。

4、將 a 後面的數,由小到大排列。

通過找13254的下乙個排列理解上步驟

解釋一下:

步驟二在幹嘛:如13254的從右第乙個遞增相鄰是25,所以2要換成其他值 ,那後面有54我們選4不選5為什麼呢?因為放在2的位置》2,有點不好說,根據規律得出結論。

步驟三交換:13254變13452

步驟四:對於步驟三4位置之後因為剛交換過嗎,所以後面應該是最小的排列方式即遞增方式

劍指Offer(二十七) 字串的排列(字串)

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第...

(二十)劍指offer之字串的排列

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

劍指offer 字串

問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...