写点什么

LeetCode 题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释

用户头像
Lee Chen
关注
发布于: 2020 年 11 月 26 日
LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/


解题思路:


  1. 假设输入是'23',那么就需要在'2'对应的字母映射'abc'中分别选取一个。再以此为基础,从'3'对应的字母映射'def'中选取一个,组合成最终结果。

  2. 由于输入的数字并不确定长度,因此选择用递归的方式遍历digits

  3. 每层递归处理的都通过参数current,选择当前需要处理的字母映射。

  4. 在递归中利用for循环遍历字母映射,逐个完成对字母的选中,之后下探到下层递归,处理下一个数字。


```javascript []

/**

* @param {string} digits

* @return {string[]}

*/

var letterCombinations = function (digits) {

// 如果传入 digits 为空,则直接返回结果[]

if (!digits || !digits.length) {

return [];

}


// 使用 Map 存储按键对应的字母

const map = new Map([

['2', 'abc'],

['3', 'def'],

['4', 'ghi'],

['5', 'jkl'],

['6', 'mno'],

['7', 'pqrs'],

['8', 'tuv'],

['9', 'wxyz'],

]);

// 存储最终结果

let result = [];


// 回溯生成所有的字符串组合

function backtrack(str, current) {

// 递归终止条件

// 当生成的字符串长度等于输入长度时,表示生成完毕,储存结果并退出循环。

// 若不退出,由于 current 已经超出了 digits 长度,会因 map.get 获取值为空而报错。

if (str.length === digits.length) {

result.push(str);

return;

}


// 当前层递归逻辑

// 从 Map 中获取当前输入的数字映射的字母

const digit = map.get(digits[current]);


// 遍历当前映射的字符串,生成不同组合

for (let i = 0; i < digit.length; i++) {

// 下探到下层递归

// 在当前字符串中选取一个字母,进入下一层递归的选择

backtrack(str + digit[i], current + 1);

}

}


// 回溯生成组合,初始状态 str 为空,current 为 0

backtrack('', 0);


return result;

};

```


发布于: 2020 年 11 月 26 日阅读数: 63
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释