劍指offer 字串的組合

2021-07-30 02:50:59 字數 1406 閱讀 9682

劍指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,便可得到字串的全部組合。

這裡沒有去除重複子串,也沒按照字典序輸出,如果要求按照字典序輸出,並去掉重複子串的話,可以採取上道題目一樣的辦法,先將所有的字串儲存在字串陣列中,而後通過快排使陣列中的字串按照字典序排列,再在輸出的時候,跳過重複的字串。

實現**如下:

[cpp]view plain

copy

#include

#include

#include

/*模擬二進位制加1操作,當最高位要進製時,說明所有的位都是1,返回false,

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

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

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

*/bool

increment(

char

*bindadd,

intlen)  

else

}  else

break

;  }  

return

true

;  }  

/*輸出字串的所有組合

*/void

cominationall(

char

*str)  

putchar('\n'

);  

}  free(bindadd);  

bindadd = null;  

}  int

main()    

測試結果:

劍指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...