问题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
输出:字符串的所有排列
思路:采用回溯的思想。每次固定字符为一个部分,其他字符为另一部分。将固定字符与其他字符分别依次进行交换,然后再回溯递归。
代码:
回溯算法,时间复杂度为O(n!)
class Solution {
public:
void backtrack(string str,int start, set<string> &res)
{
if(start==str.size()) // 满足结束条件
{
res.insert(str);
return;
}
for(int i=start;i<str.size();++i) // 选择列表
{
swap(str[i],str[start]); // 做选择
backtrack(str,start+1,res); // 进入下一次决策树
swap(str[i],str[start]); // 撤销选择
}
}
vector<string> Permutation(string str)
{
if(str.empty())
return {};
set<string> res;
backtrack(str,0,res);
return vector<string>(res.begin(),res.end());
}
};
利用C++ algorithm中的next_permutation(),时间复杂度为O(n!*n).
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.empty())
return result;
sort(str.begin(),str.end());
result.push_back(str);
while(next_permutation(str.begin(),str.end()))
result.push_back(str);
return result;
}
};