这道题与昨天的组合问题没有太大区别,只需要添加一个加和等于目标和的条件,同时也可以根据这个目标和进行剪枝。
class Solution{
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int startIndex, int n, int k, int sum){
if(sum > n) return;
if(path.size() == k){
if(sum == n) result.push_back(path);
return;
}
for(int i = startIndex; i <= 9 - (k - path.size() - 1); i++){
path.push_back(i);
backtracking(i + 1, n, k, sum + i);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n){
backtracking(1, n, k, 0);
return result;
}
};
仍然将这个穷举问题抽象为树结构。当遍历到某个节点时,子树的分支数目等于该数字对应的字母个数。另外要注意输入空字符串,需要返回一个空数组,不能含有空字符,这里需要单独处理的。
class Solution{
public:
vector<string> result;
string s;
string letterMap[10] = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
void backtracking(string digits, int index){
if(digits.length() == index){
result.push_back(s);
return;
}
int digit = digits[index] - '0';
string letter = letterMap[digit];
for(int i = 0; i < letter.size(); i++){
s.push_back(letter[i]);
backtracking(digits, index + 1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits){
if(digits.length() == 0) return result;
backtracking(digits, 0);
return result;
}
};