LeetCode-17. 电话号码的字母组合

LeetCode-17. 电话号码的字母组合

    • 题目
    • 解法
    • 笔记

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

LeetCode-17. 电话号码的字母组合_第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 对应于无序的hash,更省时空;map是有序的(基于红黑树)。记录每个数字对应的字符串
    unordered_map<char,string> phoneMap = {
        {'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},
        {'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}
    };
// ans保存最终的结果,current保存当前的结果
    vector<string> ans;
    string current;

// 回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解。在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接DFS穷举所有的解即可。
    void DFS(int index, string digits){
        //出口
        if(index == digits.length()){
            ans.push_back(current);
            return;
        }
        //递归调用
        //对于当前输入的第index号数字(digits[index]),
        //枚举其对应的所有字母(M[digits[index]][i])
        for(int i = 0 ; i < phoneMap[digits[index]].size();i++){
            current.push_back(phoneMap[digits[index]][i]); //临时结果压入一个字母
            DFS(index + 1 , digits);//以在当前位置压入该字母这一“情况”为前提,构造此“分支”的后续结果
            current.pop_back(); //状态还原,例如临时结果从 "ad" -> "a",下一次循环尝试"ae" 

        }

    }

    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,其主要的区别是,回溯法在求解过程中不保留完整的树结构(剪枝),而深度优先搜索则记下完整的搜索树。
为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了。

你可能感兴趣的:(LeetCode刷题,算法,数据结构,dfs,c++,递归算法)