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

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

题目

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值