一:N个字符的全排列
深度搜索实现
//比较简单的代码,这个题目算经典的
class
Solution {
public
:
vector<string> Permutation(string str) {
if
(str!=
""
) dfs(str, 0);
return
ret;
}
private
:
vector<string> ret;
void
dfs(string str,
int
s){
int
sz = str.size();
if
(s==sz){
ret.push_back(str);
return
;
}
for
(
int
i = s; i < sz; ++i){
if
(i!=s && str[s]==str[i])
continue
;
swap(str[s], str[i]);
dfs(str, s+1);
}
}
};
二:无重复元素的子集
回溯法的经典求解过程
#include<stdio.h>
#include <vector>
//using namespace std;
class Solution{
public:
std::vector<std::vector<int> > Subset(std::vector<int> &nums) {
std::vector<std::vector<int> > result;
std::vector<int> item;
result.push_back(item);
generate(0,nums,item,result);
return result;
}
private:
void generate(int i,std::vector<int>&nums,std::vector<int> &item,
std::vector<std::vector<int> >&result)
{
if(i>=nums.size())
{return;}
item.push_back(nums[i]);
result.push_back(item);
generate(i+1,nums,item,result);
item.pop_back();
generate(i+1,nums,item,result);
}
};
int main()
{
std::vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
Solution A;
std::vector<std::vector<int> > result;
result = A.Subset(nums);
for(int i=0;i<result.size();i++)
{
for(int j=0;j<result[i].size();j++)
{printf("[%d]",result[i][j]);}
printf("\n");
}
return 0;
}
三:求有重复元素