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'] 的一个数字。

方法一:dfs+回溯

时间复杂度:O(3^m+4^n),m和n分别是3个字母和4个字母对应的数字个数

空间复杂度:O(m+n)

复制代码
 1 /**
 2  * @param {string} digits
 3  * @return {string[]}
 4  */
 5 var letterCombinations = function(digits) {
 6     if (digits.length === 0) {
 7         return [];
 8     }
 9     const res = [];
10     const map = { //建立电话号码和字母的映射关系
11         '2': 'abc',
12         '3': 'def',
13         '4': 'ghi',
14         '5': 'jkl',
15         '6': 'mno',
16         '7': 'pqrs',
17         '8': 'tuv',
18         '9': 'wxyz'
19     }
20     const dfs = (curStr, i) => { //curStr是递归每一层的字符串,i是扫描的指针
21         if (i > digits.length - 1) { //边界条件,递归的出口
22             res.push(curStr); //其中一个分支的解推入res
23             return; //结束递归分支,进入另一个分支
24         }
25         const letters = map[digits[i]]; //取出数字对应的字母
26         for (const letter of letters) {
27             //进入不同字母的分支
28             dfs(curStr + letter, i + 1) //参数传入新的字符串,i右移,继续递归
29         }
30     }
31     dfs('', 0); //递归入口,传入空字符串,i初始为0的位置
32     return res;
33 }
复制代码
posted @   icyyyy  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示