题目:
输入一个字符串,求该字符串中字符的所有组合。
例如输入三个字符a, b, c,则它们的组合有 a, b, c, ab, ac, bc, abc。当交换字符串中的字符时,虽然能得到两个不同的排列,但却是同一个组合。比如 ab 和 ba 是不同的排列,但只算一个组合。
思路:
在求n个字符的长度为m的时候,我们把这n个字符分成两部分:第一个字符和其余的所有字符。
如果组合里包含第一个字符,则下一步在剩余的n-1个字符里选取m-1个字符;如果组合里不包含第一个字符,则下一步在剩余的n-1个字符里选取m个字符。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string>ans;
void backtrack(const string& str, int m, string& tmp) {
if (m == 0) {
ans.push_back(tmp);
return;
}
int n = str.size();
if (n >= m) {
tmp += str[0];
string a = str.substr(1);
backtrack(a, m - 1, tmp);
tmp.pop_back();
backtrack(a, m, tmp);
}
}
void Solution(string str) {
int n = str.size();
for (int i = 1; i <= n; ++i) {
string tmp = "";
backtrack(str, i,tmp);
}
}
int main() {
Solution("abcd");
for (auto j : ans) {
cout << j<<endl;
}
return 0;
}