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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试题精选100题(28)-字符串的排列[算法]

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(28)-字符串的排列[算法] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:輸入一個(gè)字符串,打印出該字符串中字符的所有排列。例如輸入字符串 abc ,則輸出由字符 a 、 b 、 c 所能排列出來(lái)的所有字符串 abc acb 、 bac 、 bca 、 cab cba 。

分析:這是一道很好的考查對(duì)遞歸理解的編程題,因此在過(guò)去一年中頻繁出現(xiàn)在各大公司的面試、筆試題中。

我們以三個(gè)字符abc為例來(lái)分析一下求字符串排列的過(guò)程。首先我們固定第一個(gè)字符a,求后面兩個(gè)字符bc的排列。當(dāng)兩個(gè)字符bc的排列求好之后,我們把第一個(gè)字符a和后面的b交換,得到bac,接著我們固定第一個(gè)字符b,求后面兩個(gè)字符ac的排列?,F(xiàn)在是把c放到第一位置的時(shí)候了。記住前面我們已經(jīng)把原先的第一個(gè)字符a和后面的b做了交換,為了保證這次c仍然是和原先處在第一位置的a交換,我們?cè)谀?/span>c和第一個(gè)字符交換之前,先要把ba交換回來(lái)。在交換ba之后,再拿c和處在第一位置的a進(jìn)行交換,得到cba。我們?cè)俅喂潭ǖ谝粋€(gè)字符c,求后面兩個(gè)字符b、a的排列。

既然我們已經(jīng)知道怎么求三個(gè)字符的排列,那么固定第一個(gè)字符之后求后面兩個(gè)字符的排列,就是典型的遞歸思路了。

基于前面的分析,我們可以得到如下的參考代碼:

void Permutation(char* pStr, char* pBegin);/ // Get the permutation of a string, // for example, input string abc, its permutation is // abc acb bac bca cba cab / void Permutation(char* pStr) {Permutation(pStr, pStr); }/ // Print the permutation of a string, // Input: pStr - input string // pBegin - points to the begin char of string // which we want to permutate in this recursion / void Permutation(char* pStr, char* pBegin) {if(!pStr || !pBegin)return;// if pBegin points to the end of string,// this round of permutation is finished, // print the permuted stringif(*pBegin == '\0'){printf("%s\n", pStr);}// otherwise, permute stringelse{for(char* pCh = pBegin; *pCh != '\0'; ++ pCh){// swap pCh and pBeginchar temp = *pCh;*pCh = *pBegin;*pBegin = temp;Permutation(pStr, pBegin + 1);// restore pCh and pBegintemp = *pCh;*pCh = *pBegin;*pBegin = temp;}} }

擴(kuò)展1:如果不是求字符的所有排列,而是求字符的所有組合,應(yīng)該怎么辦呢?當(dāng)輸入的字符串中含有相同的字符串時(shí),相同的字符交換位置是不同的排列,但是同一個(gè)組合。舉個(gè)例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc

擴(kuò)展2:輸入一個(gè)含有8個(gè)數(shù)字的數(shù)組,判斷有沒(méi)有可能把這8個(gè)數(shù)字分別放到正方體的8個(gè)頂點(diǎn)上,使得正方體上三組相對(duì)的面上的4個(gè)頂點(diǎn)的和相等。

本文已經(jīng)收錄到《劍指Offer——名企面試官精講典型編程題》一書(shū)中,有改動(dòng),書(shū)中的分析講解更加詳細(xì)。歡迎關(guān)注。

本題已被九度Online Judge系統(tǒng)收錄,歡迎讀者移步到http://ac.jobdu.com/hhtproblems.php在線測(cè)試自己的代碼。

博主何海濤對(duì)本博客文章享有版權(quán)。網(wǎng)絡(luò)轉(zhuǎn)載請(qǐng)注明出處http://zhedahht.blog.163.com/。整理出版物請(qǐng)和作者聯(lián)系。對(duì)解題思路有任何建議,歡迎在評(píng)論中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht與我討論。謝謝。

總結(jié)

以上是生活随笔為你收集整理的程序员面试题精选100题(28)-字符串的排列[算法]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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