题目:
输入一个字符串,求该字符串中字符的所有组合。
例如输入三个字符a, b, c,则它们的组合有 a, b, c, ab, ac, bc, abc。当交换字符串中的字符时,虽然能得到两个不同的排列,但却是同一个组合。比如 ab 和 ba 是不同的排列,但只算一个组合。
思路:
在求n个字符的长度为m的时候,我们把这n个字符分成两部分:第一个字符和其余的所有字符。
如果组合里包含第一个字符,则下一步在剩余的n-1个字符里选取m-1个字符;如果组合里不包含第一个字符,则下一步在剩余的n-1个字符里选取m个字符。
#include#include #include using namespace std; vector 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<



