【劍指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, 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<stdio.h> #include<string.h> #include<stdlib.h> /* 模擬二進位制加1操作,當最高位要進位時,說明所有的位都是1,返回false, 用char陣列來模擬比int陣列更省空間,這裡必須傳入陣列長度len, 由於我們CominationAll中將要傳入的字元陣列全部初始化為了'\0', 如果在該函式內部用strlen計算的話,會得到len=0。 */ bool Increment(char *BindAdd,int len) { if(BindAdd == NULL) return false; BindAdd[len-1]++; int i; for(i=len-1;i>=0;i--) { if(BindAdd[i] >= 2) { if(i == 0) { BindAdd[i]--; return false; } else { BindAdd[i] -= 2; BindAdd[i-1]++; } } 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<len;i++) { if(BindAdd[i] == 1) putchar(str[i]); } putchar('\n'); } free(BindAdd); BindAdd = NULL; } int main() { char str[10]; while(gets(str)) CominationAll(str); return 0; }
相關推薦
【劍指offer】字串的組合
劍指offer上的拓展題目,輸入一個字串,輸出該字串的字元的所有組合,比如輸入字串:abc,輸出a、b、c、ab、ac、bc、abc。 思路:與上一題類似,也可以用遞迴求解。可以考慮求長度
【劍指offer】字串的排列與組合
【1、字串排列】 【題目】 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
【python資料結構與演算法】【劍指offer】字串的排列
題目描述: 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba,且要求輸出字串按序排列,不可重複 思路: 其實排列問題的思路很簡單,有點類似《劍指offer
【劍指offer】字串的全排列
題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。 注意有可能重
【劍指offer】字串的排列
題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。 class
【劍指offer】 字串替換
題目: 請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 1、 為了減少插入時字串的移位消耗,可生成一個物件去進行append操作
【劍指Offer】字串全排列
題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字
【劍指offer】請實現一個函式,將一個字串中的每個空格替換
劍指offer 題目如下 請實現一個函式,將一個字串中的每個空格替換成"%20"。 例如,當字串為We Are Happy, 則經過替換後的字串為 We%20Are%20Happy。 具體的程式碼實現如下 1.遍歷實現 public class Solution {
【劍指offer】面試題20:表示數值的字串
題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串 ”+100”、”5e2”、”-123”、”3.1416”和”-1E-16”都表示數值。 但是”12e”、”1a3.14”、”1.2.3”、”+-5”和”12e+4.3”都不是。
【劍指offer】左旋轉字串【python】
題目描述:組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是
【劍指offer】左旋轉字串
執行時間:31ms 佔用記憶體:5732k Python很簡單,因為字串可以看做迭代器,直接切片分開即可 # -*- coding:utf-8 -*- class Solution: def LeftRotateString(self, s, n):
【劍指offer】之左旋轉字串
題目描述:組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”a
【劍指offer】醜數
accep org sof 動態內存 sca 時間 sta ren stream 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27537591題目描寫敘述:把僅僅包括因子2、3和5的數稱作醜數(Ugly Num
【劍指offer】無聊的1+2+...+n
乘除 detail lin targe while http off 技術分享 i++ 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27964027題目描寫敘述:求1+2+3+...+n,要求不能使用乘除法、f
【劍指offer】樹的子結構
九度oj ac代碼 例子 order lan def mem targe 代碼 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/25907685 劍指offer第18題,九度OJ上測試通過!題目描寫敘述:輸入
【劍指offer】撲克牌的順子
計數排序 int 哈希 image tar ati () con 模擬 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27849055題目描寫敘述:LL今天心情特別好,由於他去買了一副撲克牌,發現裏面竟然有2個大
【劍指offer】數組中僅僅出現一次的數字(1)
tdi eof 一個 ase pos acc -s ret n) 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27649027題目描寫敘述:一個整型數組裏除了兩個數字之外,其它的數字都出現了兩次。請敲代碼找出這
【劍指offer】和為S的連續正數序列
col ++ log 指針 fin ger bsp style res 題目:小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到
【劍指offer】二分查找二維數組
案例 index lan 溢出 ble 可能 outline pan min 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/24977113 劍指offer上的第三道題目。在九度OJ上測試通過題目描寫敘述
【劍指offer】二叉搜索樹轉雙向鏈表,C++實現
pointer 題目 size point nod off log tco public 原創博文,轉載請註明出處!# 題目 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。要求不能創建任何新的節點