题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
分析:
第一步:把第一个字符和后面的所有字符交换;
第二步:固定一个字符,求后面的字符的排列;
完整代码:
class Solution {
public:
vector<string> Permutation(string str) {
//声明一个容器用
vector <string> array;
//检查输入的合法性
if(str.length() <= 0)
return array;
Permutation(str, array, 0);
//此时得到的array中排列并不是字典排序,可以单独再排下序
sort(array.begin(), array.end());
return array;
}
private:
void Permutation(string str, vector<string>&array, int pBegin)
{
//递归结束的条件:索引已经指向str最后一个元素
if(pBegin == str.size() - 1)
array.push_back(str);
else
{
for(int i = pBegin; i <= str.size() - 1; i++)
{
//有重复的字符时,跳过
if(i != pBegin && str[i] == str[pBegin])
continue;
//当 i= pBegin时,也要遍历其后面的所有字符
//当 i!= pBegin时,先交换,使第pBegin位渠道不同的字符,再遍历后面的字符
swap(str[i], str[pBegin]);
//遍历其后面的字符
Permutation(str, array, pBegin + 1);
}
}
}
};