题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
牛客网题目链接
解题思路:用set保存中间结果集,确保唯一性,先举出一个元素的全排列,再往里面逐个添加元素,每次增加一个元素,该元素在之前结果集的每一个排列,假设该排列的字符串长度为k, 那么该元素有k+1个位置可以插入,形成新的排列,再将新的排列保存,下次再添加新元素,拿新的排列集合去做同样的操作,直到所有元素加入完成,用优先队列排字典序,再将结果返回。
class Solution {
public:
set<string> solve(char a, set<string> tt){
set<string> ans;
if(tt.empty()){
string s = "";
s += a;
ans.insert(s);
}else{
set<string>::iterator it;
for(it = tt.begin();it != tt.end(); ++it){
string s = (*it);
ans.insert(a + s);
int len = s.length();
for(int j = 1;j < len;++j){
string news = s.substr(0,j) + a + s.substr(j,len-1);
ans.insert(news);
}
ans.insert(s + a);
}
}
return ans;
}
vector<string> Permutation(string str) {
//A-Z a-z
//init
int len = str.length();
priority_queue<char, vector<char>, greater<char> > firs;
for(int i = 0;i < len;++i)firs.push(str[i]);
//first order
string first_order = "";
while(!firs.empty()){
first_order += firs.top();
firs.pop();
}
int cnt = 0;
set<string> ans;
while(cnt < len){
ans = solve(str[cnt], ans);
++cnt;
}
//trans
priority_queue<string, vector<string>, greater<string> > trans;
set<string>::iterator it;
for(it = ans.begin();it != ans.end(); ++it){
trans.push((*it));
}
vector<string> realans;
while(!trans.empty()){
realans.push_back(trans.top());
trans.pop();
}
return realans;
}
};
其实STL 里面已有求全排列的function
以下为别人使用STL中next_permutation函数的代码,解法
关于该函数学习资料可参考 使用STL的next_permutation函数生成全排列(C++)
链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
来源:牛客网
//简短的AC代码。调用了STL的next_permutation函数
vector<string> Permutation(string str) {
vector<string> answer;
if(str.empty())
return answer;
sort(str.begin(),str.end());
do{
answer.push_back(str);
}
while(next_permutation(str.begin(),str.end()));
return answer;
}