[LeetCode 17]电话号码的字母组合
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
1.解题思路:
-
-
- 题目包含输入的值不是确定的位数,所以第一个反应是想到用递归。
-
var letterCombinations = function (digits) { const map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'] const len = digits.length const arr = digits.split('').map(Number) const result = [] function concatStr(i,str) { if(i == len){ result.push(str) return } const tmp = map[arr[i]] for(let j=0;j<tmp.length;j++){ concatStr(i+1,str+tmp[j]) } } concatStr(0,'') return result };
2.解题思路:
-
-
- 这是leetcode上看到的,用reduce+map代替递归。以后碰到累加的问题可以优先考虑reduce
- 善用for...of能减少代码
-
var letterCombinations = function (digits) { const num2letter = { '2': ['a', 'b', 'c'], '3': ['d', 'e', 'f'], '4': ['g', 'h', 'i'], '5': ['j', 'k', 'l'], '6': ['m', 'n', 'o'], '7': ['p', 'q', 'r', 's'], '8': ['t', 'u', 'v'], '9': ['w', 'x', 'y', 'z'] } //处理length<2的情况 if (digits.length === 0) return []; if (digits.length === 1) return num2letter[digits] //数字对应字母数组 let lettersArr = []; for (let item of digits) { lettersArr.push(num2letter[item]) } //组合两个旧数组成为一个新数组,然后用这个新数组再去和下一个组合 reduce let res = lettersArr.reduce((pre, cur) => { let temp = []; pre.map(item => { cur.map(item1 => { temp.push(item + item1) }) }) return temp; }) return res; };