题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
这是一道典型回溯法的题目,类似于八皇后。利用dfs进行求解。由于可能出现重复字符串,因此必须将中间结果存入集合后转入vector中,最后进行排序。
#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<string> Permutation(string str) {
char* ch = (char*)str.c_str();
int len = str.length();
vector<string> ans;
set<string> s;
if(str == ""){
return ans;
}
dfs(s,str,len,0);
for(set<string>::iterator it = s.begin() ; it != s.end() ; it++){
ans.push_back(*it);
}
sort(ans.begin(),ans.end());
return ans;
}
void dfs(set<string>& s,string str,int len,int cnt){
if(cnt == len){
s.insert(str);
}else{
for(int i = cnt ; i < len ; i++){
char tmp = str[cnt];
str[cnt] =str[i];
str[i] = tmp;
dfs(s,str,len,cnt+1);
tmp = str[cnt];
str[cnt] =str[i];
str[i] = tmp;
}
}
}
};