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