给定一个仅包含数字 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 }

原文地址:http://www.cnblogs.com/icyyyy/p/16876753.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性