日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试题整理8 字符串的排列

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题整理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后面的字符串遞歸地做排列操作。


void Permutation(char* pStr) {if(pStr == NULL)return;Permutation(pStr, pStr); }void Permutation(char* pStr, char* pBegin) {if(*pBegin == '\0'){printf("%s\n", pStr);}else{for(char* pCh = pBegin; *pCh != '\0'; ++ pCh){if( pCh == pBegin ){Permutation(pStr, pBegin + 1);continue;}/*if( *pCh == *pBegin ) //去除和第一個字符相同的{continue;}*/char temp = *pCh;*pCh = *pBegin;*pBegin = temp;Permutation(pStr, pBegin + 1);temp = *pCh;*pCh = *pBegin;*pBegin = temp;}} }

總結

以上是生活随笔為你收集整理的面试题整理8 字符串的排列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。