15. 全排列
给定一个数字列表,返回其所有可能的排列。
样例 1:
输入:[1] 输出: [ [1] ]
样例 2:
输入:[1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
挑战
使用递归和非递归分别解决。
注意事项
你可以假设没有重复数字。
思路:回溯法
1 定义回溯函数。
2 定义递归结束条件,即起始位置大于等于数组大小。
3 每次交换俩个数,递归后在交换回来,保证下次递归。
class Solution {
public:
vector<vector<int>> permute(vector<int> &nums) {
// write your code here
vector<vector<int>> result;
vector<int> temp;
if(nums.size()==0)
{
result.push_back(temp);
return result;
}
permuteRecur(nums, 0, result, temp);
return result;
}
void permuteRecur(vector<int> &nums,int index,vector<vector<int>> &result,vector<int> &temp)
{
if(index==nums.size())
{
result.push_back(temp);
return;
}
for(int i=index;i<nums.size();i++)
{
swap(nums[index], nums[i]);
temp.push_back(nums[index]);
permuteRecur(nums, index+1, result, temp);
temp.pop_back();
swap(nums[index], nums[i]);
}
}
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
};
补充:
给一个字符串,给出它的所有排列
#include <iostream>
#include <string>
using namespace std;
void pailie(string s, string temp)
{
if(s.length()==0)
{
cout << temp<<endl;
return;
}
for(int i=0;i<s.length();i++)
{
string news=s.substr(0, i)+s.substr(i+1,s.length());//去掉String中的某个字母
pailie(news, temp+s[i]);
}
}
int main()
{
string s="abcd";
pailie(s,"");
return 0;
}