版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okiwilldoit/article/details/78678130
题目:输入一个字符串,输出该字符串中所有字符的排列组合。
如abc,输出:abc acb bac bca cab cba
经典的排列组合问题,思路:
肯定用递归的思想,先固定一个字符,然后再将剩下的字符继续排列组合。
递归函数的参数有三个:原来的字符str,一种组合result,组合集合(输出的结果)result_set
递归函数结束条件是str.size()=0。
从0开始遍历str,将str[i]拼接到result后面,然后得到一个除str[i]字符以外的子串sub_str,对sub_str继续递归。
递归完成后,为什么要删除result中最后一个字符?因为此时result已经是一种组合,删除最后一个字符,继续下一次组合。
代码如下:
void Permutations(string &str, string &result, vector<string> &result_set)
{
int len = str.size();
if(len == 0)
{
result_set.push_back(result);
printf("%s\t",result.c_str());
return;
}
for(int i=0; i<len; ++i)
{
result += str[i];
string sub_str;//sub_str是除了字符c以外的子串
for(int j=0; j<len; ++j)
{
if(j != i)
{
sub_str += str[j];
}
}
Permutations(sub_str, result, result_set);
result = result.substr(0, result.size()-1);
}
}
int main()
{
string str = "abc";
string result;
vector<string> result_set;
Permutations(str, result, result_set);
return 0;
}
Leetcode上有类似的题目:
http://blog.csdn.net/okiwilldoit/article/details/20631935