輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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...