总结leetcode75中的回溯算法题解题思路。
上一篇:力扣75——二分查找
题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
题解:
回溯。定义一个递归函数backtrack()
。每次先判断是否已经遍历出某一个组合,是则将其push_back
进combinations
中;否则就从哈希表中取出下一个数字对应的字母,然后用for循环
(加入字母、继续backtrack()
、退出字母)。
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();
}
}
}
};
题目:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
题解:
回溯。本质上和题目1一样。
class Solution {
public:
vector<int> temp;
vector<vector<int>> ans;
void dfs(int cur, int n, int k, int sum) {
if (temp.size() + (n - cur + 1) < k || temp.size() > k) {
return;
}
if (temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == sum) {
ans.push_back(temp);
return;
}
temp.push_back(cur);
dfs(cur + 1, n, k, sum);
temp.pop_back();
dfs(cur + 1, n, k, sum);
}
vector<vector<int>> combinationSum3(int k, int n) {
dfs(1, 9, k, n);
return ans;
}
};
适合的题型:有多步选择,每一步可以有2种甚至多种选择,需要找出所有符合条件的选择。