求字符串组合

题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

非递归实现:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void Print_str(char *str,int length , int s)
 5 {
 6     
 7     for(int i = 0 ; i <length ; ++i)
 8     {
 9         if( s & ( 1 << i ) )         // 判断s的二进制中哪些位为1,即代表取某一位
10             cout<<str[i];   //例如:001 010 011 100 101 110 111
11     }
12     cout<<endl;
13     
14 }
15 
16 void Combination(char *str,int length)
17 {
18     for(int i= 1 ; i < ( 1<<length ) ; ++i)
19     {
20         Print_str(str,length,i);
21     }
22 }
23 
24 
25 
26 int main(void)
27 {
28     char str[] = "abc";
29     Combination( str, strlen(str) );
30     system("pause");
31     return 0;
32 }

 

递归实现:

假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstring>
 4 #include<assert.h>
 5 using namespace std;
 6 
 7 
 8 void Combination(char *string ,int number,vector<char> &result);
 9 
10 void Combination(char *string)
11 {
12     assert(string != NULL);
13     vector<char> result;
14     int i , length = strlen(string);
15     for(i = 1 ; i <= length ; ++i)
16         Combination(string , i ,result);
17 }
18 
19 void Combination(char *string ,int number , vector<char> &result)
20 {
21     assert(string != NULL);
22     if(number == 0)
23     {
24         static int num = 1;
25         printf("第%d个组合\t",num++);
26 
27         vector<char>::iterator iter = result.begin();
28         for( ; iter != result.end() ; ++iter)
29             printf("%c",*iter);
30         printf("\n");
31         return ;
32     }
33     if(*string == '\0')
34         return ;
35     result.push_back(*string);
36     Combination(string + 1 , number - 1 , result);
37     result.pop_back();
38     Combination(string + 1 , number , result);
39 }
40 
41 int main(void)
42 {
43     char str[] = "abc";
44     Combination(str);
45     system("pause");
46     return 0;
47 }
posted @ 2013-07-24 18:58  NinaGood  阅读(206)  评论(0编辑  收藏  举报