17.电话号码的字母组合

96 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

17.电话号码的字母组合

题目分析

题目给出一个包含数字2到9的字符串,要求返回他所有能表示的字母组合。数字到字母的映射与电话按键相同。如下图所示:

image.png

这道题目与前两道题相似,同样不能仅仅用for循环的方式解决。所以我们应该继续使用回溯算法来解决。

解题

首先,我们应该考虑数字和字母如何映射,在做哈希表相关的题时,我们已经知道了映射可以使用哈希表的结构来解决。所以这一个不是困难。

接下来我们要用回溯法来解决这个问题,我们通过for横向循环遍历单个按键的对应的字母,使用递归纵向遍历按键数。

接下来进行回溯三部曲:

  1. 递归函数的参数

参数第一个是给出的按键组合,第二个需要按键的个数,第三个就是当前遍历到了第几个按键。

  1. 回溯函数终止条件

当递归遍历完所有的按键后即可终止返回。

  1. 单层搜索的过程

首先需要在map中找到相应的字符,接下来通过循环来处理字符,通过递归处理所有可能存在的情况。leetcode上的题没有考虑到按键为1或者*或者#的情况,如果遇到别的题,需要考虑一下这样的异常。

代码如下:

var letterCombinations = function(digits) {
    const k = digits.length
    const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
    if(!k) return []
    if(k === 1) return map[digits].split("")
    const res = [],path = []
    backtracking(digits,k,0)
    return res
    function backtracking(n,k,a) {
        if(path.length === k) {
            res.push(path.join(""))
            return
        }
        for(const v of map[n[a]]) {
            path.push(v)
            backtracking(n,k,a + 1)
            path.pop()
        }
    } 
};