题目:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
按照字典序深度优先加回朔。
注意:保存结果时先查看是否已经存在,因为有重复字符;
也可以用一个set保存结果,直接插入,set自己去重。
代码:
class Solution {
public:
vector<string> Permutation(string str)
{
if(str.empty())
return vector<string> ();
sort(str.begin(), str.end());
string cur_string;
vector<string> res;
DFS(str, cur_string, res);
return res;
}
void DFS(string &str, string &cur_string, vector<string> &res)
{
if(str.size() == 1)
{
cur_string.append(str);
if(res.end() == find(res.begin(), res.end(), cur_string))
res.push_back(cur_string);
cur_string.erase(cur_string.size()-1, 1);
return;
}
for (int i=0;i<str.size();i++)
{
char tmp = str[i];
cur_string.append(1, tmp);
str.erase(i, 1);
DFS(str, cur_string, res);
cur_string.erase(cur_string.size()-1, 1);
str.insert(i, 1, tmp);
}
return ;
}
};