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