算法训练营day25_回溯算法(2.28补)
216.组合总和III
dfs纵向遍历,for循环横向遍历,dfs参数的确定是看如何走到下一层,终止条件是看什么时候到递归搜索树的叶子节点;
所以,先把大致的递归搜索树画出来;
class Solution {
public:
vector<int> V;
vector<vector<int>> ans;
void dfs(int u,int dis,int cnt){
if(cnt<=0){
if(dis==0) ans.push_back(V);
return;
}
if(u>=10||dis<0) return;
for(int i=u;i<=9;i++){
V.push_back(i);
dfs(i+1,dis-i,cnt-1);
V.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
V.clear();
ans.clear();
dfs(1,n,k);
return ans;
}
};
17.电话号码的字母组合
先把电话号码跟字母的映射写好;
不同层的遍历扩展不同,有多少个数字,就有多少层;
注意若为空应该返回空的vector,需要在dfs之前判断一下,否则会把""放到vector里;
class Solution {
public:
unordered_map<int,string> M={{2,"abc"},{3,"def"},{4,"ghi"},{5,"jkl"},{6,"mno"},{7,"pqrs"},{8,"tuv"},{9,"wxyz"}};
vector<string> ans;
void dfs(int u,string digits,string str){
if(u==digits.size()){
ans.push_back(str);
return;
}
string goal=M[digits[u]-'0'];
for(int i=0;i<goal.size();i++){
dfs(u+1,digits,str+goal[i]);
}
}
vector<string> letterCombinations(string digits) {
ans.clear();
if(!digits.size()) return ans;
dfs(0,digits,"");
return ans;
}
};