Day25——回溯算法Ⅱ
今日内容:
● 216.组合总和III
● 17.电话号码的字母组合
216.组合总和Ⅲ
思路:和上一题组合总和差不多,区别在于这里回溯需要给sum也回溯。
void backtracking(int k, int n, int startIndex, int sum) {
// 剪枝
if(sum > n) return;
if(path.size() == k) {
if(n == sum)
res.push_back(path);
return;
}
// 剪枝
for(int i = startIndex; i <= 10 - k + path.size(); i++) {
sum += i;
path.push_back(i);
backtracking(k, n, i + 1, sum);
sum -= path.back();
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 1, 0);
return res;
}
17.电话号码的字母组合
思路:一上强度就不知道for循环应该遍历什么了,是遍历dp呢还是遍历字符串。懵了
这里字符串是固定的,但是字符串所代表的内容是可变的,因此遍历dp,回溯找同一个地方的不同值
vector<string> dp = {"", "","abc", "def", "ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"};
vector<string> res;
string s;
public:
void backtraceing(string digits, int index) {
if(index == digits.size()) {
res.push_back(s);
return;
}
string letters = dp[digits[index] - '0'];
for(int i = 0; i < letters.size(); i++) {
s += letters[i];
backtraceing(digits, index + 1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
s.clear();
res.clear();
if(digits == "") return res;
backtraceing(digits, 0);
return res;
}