最近乙個月多的時間一直在刷劍指offer,剛做到第28題 -- 字串的排列。然後,在做擴充套件題的時候,來了個神來之筆,心情大好,分享下。
求字串(或n個字元)的所有組合。比如,輸入abc,則它的組合有a,b,c,ab,ac,c,abc。
求字串的組合問題,可以分解成求長度為1的組合,長度為2的組合,...,長度為n的組合。所以
,我們可以將這個題轉換成具體求n個字元中長度為m (1 ≤ m ≤ n) 的組合問題。
求長度為m的組合問題,我們將n個字元分成兩個部分:第乙個字元和剩下所有字元。
然後我們就可以將求n個字元中長度為m的組合問題繼續分解成以下兩個子問題:
1. 如果所求的組合裡含有第乙個字元,則我們只需要求剩下所有字元裡長度為m-1的組合;
2. 如果所求的組合裡沒有含有第乙個字元,則我們需要求剩下所有字元裡長度為m的組合;
解決這樣兩個子問題,必須會考慮到用遞迴。以下是**實現:
void combinationcore(char *pcombuff, char *pbegin, unsigned int m)
if (m == 0)
// 包含第乙個字元,在剩下的求m-1個字元的組合
pcombuff[m - 1] = *pbegin; // 神來之筆
// pcombuff為列印的組合字串,一直卡在如何給pcombuff賦值的問題這;
// 結果乙個錯誤的嘗試,完美的解決了這個問題,只是列印的順序是倒序,一點不違反原題意思。
combinationcore(pcombuff, (pbegin + 1), (m - 1));
// 不包含第乙個字元,在剩下的求m個字元的組合
combinationcore(pcombuff, (pbegin + 1), m);
}void combination(char* pstr)
unsigned int len = strlen(pstr);
char *pcombuff = new char[len + 1];
memset(pcombuff, 0, len + 1);
for (unsigned int m = 1; m <= len; m++)
delete pcombuff;
}
卡了我半天,結果乙個錯誤嘗試無意中搞定,寫**的樂趣,大概就在此了!
劍指offer 字串的組合
劍指offer上的拓展題目,輸入乙個字串,輸出該字串的字元的所有組合,比如輸入字串 abc,輸出a b c ab ac bc abc。思路 與上一題類似,也可以用遞迴求解。可以考慮求長度為n的字串中m個字元的組合,設為c n,m 原問題的解即為c n,1 c n,2 c n,n 的總和。對於求c n...
劍指offer 字串的組合
劍指offer上的拓展題目,輸入乙個字串。輸出該字串的字元的全部組合,比方輸入字串 abc,輸出a b c ab ac bc abc。思路 與上一題相似,也能夠用遞迴求解。能夠考慮求長度為n的字串中m個字元的組合。設為c n,m 原問題的解即為c n,1 c n,2 c n,n 的總和。對於求c n...
劍指offer 字串
問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...