问题描述

给定字符串,求出该字符串的所有组合,即它的所有字串。例如“abc”,应该得到"a","b","c","ab","ac","bc","abc"。

思路一

如果没有要求按长度从小到大输出,可以逐位考虑是否选取,代码如下: 



1 #include<stdio.h>
2 #include<vector>
3 #include<cstring>
4 using namespace std;
5
6 const int maxn = 100 + 10;
7 char str[maxn];
8 vector<char>res;
9
10 //字符串str已排序k个
11 void Combination(char * str,int k,vector<char>res)
12 {
13 if (k == strlen(str))
14 {
15 for (int i = 0; i < res.size(); i++)
16 printf("%c", res[i]);
17 if(res.size()) printf("\n");
18 return;
19 }
20 Combination(str, k + 1, res); //不选第k+1个
21 res.push_back(str[k]);
22 Combination(str, k + 1, res); //选第k+1个 //不选写在前面,不存在要回溯的情况
23 }
24
25
26 int main()
27 {
28 scanf("%s", str);
29 Combination(str, 0, res);
30 return 0;
31 }


思路二

如果要求按长度从小到大输出,我们可以先考虑长度为len的字串的所有组合,然后让len取1~strlen(str)即可得到所有组合。代码如下:



1 #include<stdio.h>
2 #include<iostream>
3 #include<vector>
4 using namespace std;
5
6 const int maxn = 100 + 10;
7 char str[maxn];
8 vector<char>res;
9
10 //字符串str的长度为len的有序排序
11 void Combination(char* str, int cur,int len, vector<char> res)
12 {
13 if (len == 0)
14 {
15 for(int i = 0;i < res.size();i++)
16 printf("%c", res[i]);
17 printf("\n");
18 return;
19 }
20 if (cur == strlen(str)) return; //未得到长为len的字串,要及时退出
21 res.push_back(str[cur]);
22 Combination(str, cur + 1, len - 1, res);
23 res.pop_back(); //回溯
24 Combination(str,cur + 1,len,res);
25 }
26
27 void solve(char* str)
28 {
29 int len = strlen(str);
30 for (int i = 1; i <= len; ++i) //枚举字串的长度
31 Combination(str,0, i, res);
32 }
33
34
35 int main()
36 {
37 scanf("%s", str);
38 solve(str);
39
40 return 0;
41 }



个性签名:时间会解决一切