代码随想录算法训练营第二十五天| 216.组合总和III 17.电话号码的字母组合
组合总和III
题目链接:216. 组合总和 III - 力扣(LeetCode)
思路:仿照昨天的递归模板写的,同样是for循环横向遍历,递归纵向遍历。注意当k>n时要直接跳出,否则会判断栈溢出。
额外发现一个问题就是在累加sum时,用for(auto i:path)sum+=path[i];
会出现奇怪数字,原因是auto遍历用法错误,正确写法是for(auto i:path)sum+=i;
class Solution {
public:
vector<int>path;
vector<vector<int>>result;
void backtracking(int k,int n,int startindex){
if(path.size()==k){
int sum=0;
for(int i=0;i<path.size();i++){
sum+=path[i];
}
if(sum==n){
result.push_back(path);
return;
}
}
for(int i=startindex;i<=9;i++){
path.push_back(i);
backtracking(k,n,i+1);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
if(k>n)return result;
backtracking(k,n,1);
return result;
}
};
电话号码的字母组合
题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)
思路:注意一个字符串s="12"的话,s.size()结果就是2。同时用str.pop_back()可以快速删除字符串的最后一个字符。原理是和上一题相似,只是先建立一个字符映射库,当遍历到某个数字后便开始遍历对应的字母库,只是比上一层多嵌套一个for循环。
没想到是一遍过!
class Solution {
public:
vector<string>result;
vector<string>k={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string tmp;
void backtracking(string digits,int start){
if(tmp.size()==digits.size()){
result.push_back(tmp);
return;
}
for(int i=start;i<digits.size();i++){
for(int j=0;j<k[digits[i]-50].size();j++){
tmp+=k[digits[i]-50][j];
backtracking(digits,i+1);
tmp.pop_back();
}
}
}
vector<string> letterCombinations(string digits) {
if(!digits.size())return result;
backtracking(digits,0);
return result;
}
};
官网这种写法也是值得借鉴的
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> combinations;
if (digits.empty()) {
return combinations;
}
unordered_map<char, string> phoneMap{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;
backtrack(combinations, phoneMap, digits, 0, combination);
return combinations;
}
void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {
if (index == digits.length()) {
combinations.push_back(combination);
} else {
char digit = digits[index];
const string& letters = phoneMap.at(digit);
for (const char& letter: letters) {
combination.push_back(letter);
backtrack(combinations, phoneMap, digits, index + 1, combination);
combination.pop_back();
}
}
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solutions/388738/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。