爷青回。
next_permutation 60ms
使用库函数遍历每个排列。
class Solution {
public:
vector<string> permutation(string s) {
vector<string> result;
sort(s.begin(), s.end());
do {
result.push_back(s);
} while(next_permutation(s.begin(),s.end()));
return result;
}
};
手写 next_permutation 44ms
- 从后往前找,找到第一个不满足递减的位置
- 将后面的所有数字翻转
- 把恰好大于不满足递减的位置与其交换
举个例子,35421的下一个排列是41235,第一步找到了3,第二步换成了31245,第三步把3和4交换,得到41235.
class Solution {
public:
bool my_next_permutation(string::iterator it1, string::iterator it2) {
// find longest downstairs.
auto it = it2-1;
for(; it>it1; --it) {
if(*(it-1) < *(it)) {
break;
}
}
// reverse latter.
reverse(it, it2);
// exchange with upper_bound
if(it==it1) {
return false;
} else {
swap(
*(it-1),
*upper_bound(it, it2, *(it-1))
);
return true;
}
}
vector<string> permutation(string s) {
vector<string> result;
sort(s.begin(), s.end());
do {
result.push_back(s);
} while(my_next_permutation(s.begin(),s.end()));
return result;
}
};
递归回溯 36ms
class Solution {
public:
inline bool occur(string &s, int lef, int rig) {
for(int i=lef; i<rig; ++i) {
if(s[i]==s[rig]) {
return true;
}
}
return false;
}
void dfs(string &s, int id, vector<string> &result) {
if(id==s.size()) {
result.push_back(s);
} else {
for(int i=id; i<s.size(); ++i) {
if(!occur(s, id, i)) { // s[i] 在 s[id,i) 之间没有出现过
swap(s[id], s[i]);
dfs(s, id+1, result);
swap(s[id], s[i]);
}
}
}
}
vector<string> permutation(string s) {
vector<string> result;
dfs(s, 0, result);
return result;
}
};