全排列
1、非去重递归版本
// ans-result; nums-input
void myPermute(vector<vector<int>> &ans, vector<int>& nums, int startPos) {
if (startPos == nums.size()-1) {
ans.push_back(nums);
}
else {
for (int i = startPos; i < nums.size(); ++i) {
swap(nums, startPos, i);
myPermute(ans, nums, startPos+1);
swap(nums, startPos, i);
}
}
}
2、去重递归版本代码
void myPermute(vector<vector<int>> &ans, vector<int>& nums, int startPos) {
if (startPos == nums.size()-1) {
ans.push_back(nums);
}
else {
for (int i = startPos; i < nums.size(); ++i) {
if (!findDuplicate(nums, startPos, i)) {
swap(nums, startPos, i);
myPermute(ans, nums, startPos+1);
swap(nums, startPos, i);
}
}
}
}
bool findDuplicate(vector<int> &nums, int pos1, int pos2) {
for (; pos1 < pos2; ++pos1) {
if (nums[pos1] == nums[pos2]) {
return true;
}
}
return false;
}
4、去重迭代版本
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
std::vector<std::vector<int>> vecRes;
vecRes.push_back(nums);
while(next_perm(nums)) {
vecRes.push_back(nums);
}
return vecRes;
}
bool next_perm(vector<int>& nums) {
int len = nums.size();
// step-1
bool bFind = false;
int pos1 = len-1;
for(int i = len-2; i >= 0; i--) {
if(nums[i] < nums[i+1]) {
bFind = true;
pos1 = i;
break;
}
}
if(!bFind) {
return false;
}
// step-2
int pos2 = len-1;
for(int i = len-1; i > pos1; i--) {
if(nums[i] > nums[pos1]) {
pos2 = i;
break;
}
}
// step-3
std::swap(nums[pos1], nums[pos2]);
// step-4
int i = pos1+1, j = len-1;
while(i < j) {
std::swap(nums[i], nums[j]);
++i;
--j;
}
return true;
}
};
int main() {
Solution s;
std::vector<int> nums{0, 0, 1};
std::vector<std::vector<int>> vecRes = s.permute(nums);
return 0;
}
5、去重STL函数算法版本:
class Solution {
public:
vector<string> Permutation(string str) {
if(str.empty()) return vector<string>();
vector<string> res;
sort(str.begin(), str.end());
do{
res.emplace_back(str);
}while(next_permutation(str.begin(), str.end()));
return res;
}
};