劍指offer 字串的組合

2021-09-25 04:49:07 字數 1623 閱讀 1871

劍指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, m),從第乙個字元開始掃瞄,每乙個字元有兩種情況。要麼被選中,要麼不被選中,假設被選中,遞迴求解c(n-1, m-1)。假設未被選中,遞迴求解c(n-1, m)。

無論哪種方式,n的值都會降低,遞迴的終止條件n=0或m=0。

博主是剛開始嘗試用遞迴去寫,寫了乙個多小時都沒寫出來,桑心啊!

除了操作二叉樹寫遞迴比較順。其它好多地方用遞迴愣是憋不出來。尤其字串操作。

開闢乙個於字串相應長度的int陣列(char陣列也能夠,並且更節省空間),用該陣列模擬二進位制的加1操作,則該陣列的元素僅僅能為0或1,我們規定假設該陣列某個位置處的元素是1。則字串相應位置處的字元參與組合,假設為0,則字串相應位置處的字元不參與組合。這樣講該int陣列。從全0加到全1,便可得到字串的全部組合。

這裡沒有去除反覆子串,也沒依照字典序輸出,假設要求依照字典序輸出,並去掉反覆子串的話。能夠採取上道題目一樣的辦法。先將全部的字串儲存在字串陣列中,而後通過快排使陣列中的字串依照字典序排列。再在輸出的時候,跳過反覆的字串。

實現**例如以下:

#include#include#include/*

模擬二進位制加1操作,當最高位要進製時,說明全部的位都是1,返回false。

用char陣列來模擬比int陣列更省空間。這裡必須傳入陣列長度len,

因為我們cominationall中將要傳入的字元陣列全部初始化為了'\0',

假設在該函式內部用strlen計算的話,會得到len=0。

*/bool increment(char *bindadd,int len)

else

}else

break;

} return true;}/*

輸出字串的全部組合

*/void cominationall(char *str)

else

}else

break;

} return true;}/*

輸出字串的全部組合

*/void cominationall(char *str)

{ if(str == null)

return;

int len = strlen(str);

char *bindadd = (char *)malloc(len*sizeof(char));

if(bindadd == null)

exit(exit_failure);

memset(bindadd,0,len*sizeof(char));

while(increment(bindadd,len))

{ int i;

for(i=0;i測試結果:

劍指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,剛做到第28題 字串的排列。然後,在做擴充套件題的時候,來了個神來之筆,心情大好,分享下。求字串 或n個字元 的所有組合。比如,輸入abc,則它的組合有a,b,c,ab,ac,c,abc。求字串的組合問題,可以分解成求長度為1的組合,長度為2的組合,長度為n...

劍指offer 字串

問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...