日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/21 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题整理8 字符串的排列 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《劍指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后面的字符串遞歸地做排列操作。


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 ) //去除和第一個(gè)字符相同的{continue;}*/char temp = *pCh;*pCh = *pBegin;*pBegin = temp;Permutation(pStr, pBegin + 1);temp = *pCh;*pCh = *pBegin;*pBegin = temp;}} }

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。