题目:输入一个字符串(各字符互不相等),输出其全排列。 比如输入abc 输出abc acb bac bca cab cba
思路: 全排列思想
先固定第一个字符, 第一个字符可以为字符串中任意一个。实现方式:
for(int i = 0; i < str.size(); ++i) // 遍历字符串, 每次将首个字符与第i个字符交换,即实现首个字符出现的所有情况。
{
swap(str[begin], i);
}
固定完第一个字符后,对除第一个字符外的字符串采用同样的全排列方式,所以用递归思想
for(int i = 0; i < str.size(); ++i)
{
swap(str[begin], i);
Func(str, begin+1, length);
}
循环一遍后, 因为修改的是str本身的值,所以在后续遍历前要恢复初始的str值,所以
for(int i = 0; i < str.size(); ++i)
{
swap(str[begin], i);
Func(str, begin+1, length);
}
代码:#include <iostream>
#include <string>
using namespace std;
void Func(string &str, int begin, int len)
{
if (str.empty())
{
return;
}
if (begin == len)
{
cout << str << " ";
}else
{
for (int i = begin; i < len; ++i)
{
char temp = str[begin];
str[begin] = str[i];
str[i] = temp;
Func(str, begin+1, len);
temp = str[begin];
str[begin] = str[i];
str[i] = temp;
}
}
}
int main()
{
string str("abc");
int len = str.size();
Func(str, 0, len);
system("pause");
return 0;
}