题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23” 输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “” 输出:[]
示例 3:
输入:digits = “2” 输出:[“a”,“b”,“c”]
提示:
- 0 <= digits.length <= 4
- digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
解法
class Solution {
public:
unordered_map<char,string> phoneMap = {
{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},
{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}
};
vector<string> ans;
string current;
void DFS(int index, string digits){
if(index == digits.length()){
ans.push_back(current);
return;
}
for(int i = 0 ; i < phoneMap[digits[index]].size();i++){
current.push_back(phoneMap[digits[index]][i]);
DFS(index + 1 , digits);
current.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.length() == 0) return ans;
DFS(0,digits);
return ans;
}
};
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/3sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
笔记
递归是一种算法结构,DFS是一种搜索(方法)工具,回溯是一种算法思想。 1.在函数中调用函数本身来解决子问题以达到解决原问题的方法就叫递归 对于一个可以分解的问题,子问题与原问题处理过程完全相同,区别只在于数据规模,可以用递归来解。。
2.回溯就是通过不同的尝试来搜索问题的解。 有点类似于穷举(搜索全部解空间),但是和穷举不同的是回溯会“剪枝”,对已经知道错误的结果没必要再枚举接下来的答案了。
3.回溯搜索是深度优先搜索(DFS)的一种情况 对于某一个搜索树来说(搜索树是起记录路径和状态判断的作用),回溯和DFS,其主要的区别是,回溯法在求解过程中不保留完整的树结构(剪枝),而深度优先搜索则记下完整的搜索树。 为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。
|