《劍指Offer》 求字串的組合

2021-06-30 16:35:48 字數 1251 閱讀 8770

最近乙個月多的時間一直在刷劍指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...