题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印所有字符串abc,acb,bac,bca,cab和cba。
先求取第一位所有字符的可能,即将第一位字符和后面所有的字符交换,然后继续递归求取后面子串的所有排列。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> svec;
if(str.empty())
return svec;
Permutation(str,0,svec);
sort(svec.begin(),svec.end());
return svec;
}
void Permutation(string str,int begin,vector<string>& svec)
{
//若已到字符串尾部,将该排列加入容器
if(str[begin]=='\0')
svec.push_back(str);
for(int j=begin;str[j]!='\0';++j)
{
//如果字符重复则跳过本次循环
if(begin!=j&&str[begin]==str[j])
continue;
swap(str,begin,j);
<span style="white-space:pre"> </span>Permutation(str,begin+1,svec);
swap(str,begin,j);
}
}
void swap(string &str,int i ,int j)
{
char temp=str[i];
str[i]=str[j];
str[j]=temp;
}
};