版本一:给定一个 没有重复 数字的序列,返回其所有可能的全排列,按字典序输出。
class Solution {
public:
void perm(vector<vector<int>>& res, vector<int>& arr, int p, int q){
vector<int> temp;
if(p == q){
temp = arr;
res.push_back(temp);
}
for(int i = p; i <= q; i++){
swap(arr[p], arr[i]);
perm(res, arr, p + 1, q);
swap(arr[p], arr[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
perm(res, nums, 0, nums.size() - 1);
sort(res.begin(), res.end());
return res;
}
};
版本二:输入一个字符串,按字典序打印出该字符串中字符的所有排列,可能有字符重复。(需要对结果数组进行去重)
class Solution {
public:
void perm(vector<string>& res, string s, int p, int q){
string temp;
if(p == q){
temp = s;
res.push_back(temp);
}
for(int i = p; i <= q; i++){
swap(s[p], s[i]);
perm(res, s, p + 1, q);
swap(s[p], s[i]);
}
}
vector<string> Permutation(string str) {
vector<string> res;
perm(res, str, 0, str.length() - 1);
map<string, int> map;
for(auto v : res){
if(map.find(v) == map.end()){
map[v]++;
}
}
vector<string> finalres;
for(auto v : map){
finalres.push_back(v.first);
}
return finalres;
}
};
python
from copy import deepcopy
class Solution:
def permute(self, nums: List[int]):
n = len(nums)
res = []
track = []
def backtrack(nums, track):
if len(track) == n:
res.append(deepcopy(track))
return
for i in range(n):
if nums[i] in track:
continue
track.append(nums[i])
backtrack(nums, track)
track.pop()
backtrack(nums, track)
return res