面试题整理8 字符串的排列
《劍指offer》面試題28
題目: 輸入一個(gè)字符串,打印該字符串中字符的所有排列。例如輸入字符串a(chǎn)bc,則打印出由字符a、b、c所能排列出來(lái)的所有字符串a(chǎn)bc、acb、bac、bca、cab、cba。
分析:? 當(dāng)我看到這個(gè)題目,我首先想到字符串中字符有可能重復(fù),這時(shí)候該怎么辦,如果沒(méi)有重復(fù)那就是將所有字符的排列打印出來(lái),全排列也是不怎么好求的,再往下就不好想了;
??????????? 書(shū)中用了分治的思想,將大問(wèn)題分解為小問(wèn)題。此題中將一個(gè)字符串分解為兩部分,第一部分為它的第一個(gè)字符,第二部分為后面的所有字符。
??????????? 求一個(gè)字符串的全排列,可以分兩步:首先求出所有可能出現(xiàn)在第一個(gè)位置的字符,在字符串中可以采用把第一個(gè)字符與后面的所有字符交換的方法,如abc字符串中a分別于b、c交換,第一個(gè)位置的字符可能是a、b、c;第二步固定第一個(gè)字符,求后面字符的排列。如此遞歸,直到后面的字符為字符串尾。
?????????? 但是,書(shū)上的思路并沒(méi)有考略字符串中字符重復(fù)的問(wèn)題,如字符串a(chǎn)aa,按照上述思路,排列有6種,但實(shí)際上每種都是aaa,所以應(yīng)該是只有一種。
?????????? 因此上述思路在我看來(lái)不是完全準(zhǔn)確的,當(dāng)把第一個(gè)字符與后面的字符交換時(shí),首先應(yīng)該判斷兩者是否相同,如果相同則跳過(guò),因?yàn)橐呀?jīng)處理過(guò)此種情況。
????????? 但是這個(gè)思路同樣是有問(wèn)題的,如aabb,還是會(huì)出現(xiàn)重復(fù)的情況。。對(duì)于解決重復(fù)沒(méi)有想到什么好方法。。。
????????? 所以還是默認(rèn)全排列就是所有字符不管是否相同的全排列。
代碼:
?????????在函數(shù)中pStr指向整個(gè)字符串的第一個(gè)字符串,pBegin指向當(dāng)前我們做排列操作的字符串的第一個(gè)字符。每一次遞歸從pBegin向后掃描每一個(gè)字符,交換兩者后,再對(duì)pBegin后面的字符串遞歸地做排列操作。
總結(jié)
以上是生活随笔為你收集整理的面试题整理8 字符串的排列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面试题整理7 二叉搜索树的后序遍历序列
- 下一篇: 面试题整理 8 字符串排序扩展题