https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/submissions/
实际上就是全排列。不过变成了不定长的数据。
class Solution {
public:
string str[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> ans;
string temp_ans;
int n;
vector<string> letterCombinations(string digits) {
n=digits.size();
if(n==0) return ans;
dfs(digits,0);
return ans;
}
void dfs(string digits,int deep){
if(deep==n){
ans.push_back(temp_ans);
return ;
}else{
string base=str[digits[deep]-'0'];//注意字符是ASCII码
int s=base.size();
for(int i=0;i<s;i++){
char ss=base[i];
temp_ans.push_back(ss);
dfs(digits,deep+1);
temp_ans.pop_back();
}
}
return ;
}
};
https://leetcode-cn.com/problems/subsets/
全部子集
class Solution {
public:
vector<vector<int>> ans;
vector<int> temp_ans;
int n;
vector<vector<int>> subsets(vector<int>& nums) {
n=nums.size();//数字个数,如果用int n的话,使用n的时候会使用全局变量的n=0恒为0
dfs(nums,0);
return ans;
}
void dfs(vector<int>& nums,int deep){
if(deep==n){
ans.push_back(temp_ans);
return ;
}else{
dfs(nums,deep+1);
temp_ans.push_back(nums[deep]);
dfs(nums,deep+1);
temp_ans.pop_back();
}
return ;
}
};
https://leetcode-cn.com/problems/combination-sum/
目前认为emplace_back约等于push_back,但是实际上,在一定的特例上,不一定有相同效果。
class Solution {
public:
vector<vector<int>> ans;
vector<int> combine;
int n;
void dfs(vector<int>& candidates, int target, int idx) {
if (idx == n) return;
if (target == 0) {
ans.emplace_back(combine);
return;
}
// 选择当前数
if (target - candidates[idx] >= 0) {
combine.emplace_back(candidates[idx]);
dfs(candidates, target - candidates[idx], idx);
combine.pop_back();
}
// 直接跳过
dfs(candidates, target, idx + 1);
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
n=candidates.size();
dfs(candidates, target, 0);
return ans;
}
};
实际上,这也算是一个背包问题了。