字串的所有組合
阿新 • • 發佈:2018-10-31
問題描述
給定字串,求出該字串的所有組合,即它的所有字串。例如“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