1. 程式人生 > >字串的所有組合

字串的所有組合

問題描述

給定字串,求出該字串的所有組合,即它的所有字串。例如“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 }

參考連結:https://blog.csdn.net/geekmanong/article/details/50945067