1. 程式人生 > >【劍指offer】字串的組合

【劍指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 原創博文,轉載請註明出處!# 題目 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。要求不能創建任何新的節點