Description
Write a method to compute all permutations of a string of unique characters.
Example
example1:
Input: S = "qwe"
Output: ["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
example2:
Input: S = "ab"
Output: ["ab", "ba"]
Note
All charaters are English letters.
1 <= S.length <= 9
Thought
很典型的回溯算法,可以直接套用回溯模板。
Code
- 直接套用回溯模板
class Solution {
public:
vector<string> res;
string choose;
void backtrack(string path) {
if (path.size() == choose.size()) {
res.push_back(path);
return;
}
int size = choose.size();
for (int i = 0; i < size; i++) {
if (find(path.begin(),path.end(),choose[i])==path.end()) {
path.push_back(choose[i]);
backtrack(path);
path.pop_back();
}
}
}
vector<string> permutation(string S) {
choose = S;
string path;
backtrack(path);
return res;
}
};
- 交换法求全排列:
回溯的解法时间复杂度实在是太高,所以我们可以用交换法来代替回溯的过程,具体代码见下:
class Solution {
public:
vector<string> res;
vector<string> permutation(string S) {
res.emplace_back(S);
int size = S.size();
char temp;
int length;
string place;
for (int i = 0; i < size; i++) {
length = res.size();
for (int j = i + 1; j < size; j++) {
for (int k = 0; k < length; k++) {
place = res[k];
temp = place[i];
place[i] = place[j];
place[j] = temp;
res.emplace_back(place);
}
}
}
return res;
}
};