前端算法(17)

69 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]

解题思路

思路一

我们先将数字与字母的关系定义到散列表中,根据题目上已经写明了 digits 的长度范围在 1 到 4 之间,所以我们进行定义一个 combine 函数,处理长度在 4 以内的字母分组的组合工作,最后在将定义 flattenDeep 函数将最终的多维数组转换为一维数组即可

var letterCombinations = function(digits) {
    if (!digits) return [];
    const map = {
        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'],
    };
    const letters = digits.split('').map(l => map[l]);
    const combine = (arrA, arrB, arrC, arrD) => arrA.map(a => {
      if (!arrB) return a;
      return arrB.map(b => {
        if (!arrC) return a + b;
        return arrC.map(c => {
          if (!arrD) return a + b + c;
          return arrD.map(d => a + b + c + d);
        });
      });
    });
    const flattenDeep = (arr) => Array.isArray(arr)
      ? arr.reduce( (a, b) => a.concat(flattenDeep(b)) , [])
      : [arr];
    return flattenDeep(combine(...letters));
};

思路二

我们先做一个hashMap,把数字和字母进行对应,然后再写helper函数,helprer(result, sb, digits), 在新建result数组并且做输入判断,如果digits为null或者长度为0,就返回result,然后新建字符串sb,调用helper函数,helper(result, sb, digits), 如果sb的长度和digits的长度相等,就把sb放到result里,进行返回,对于digits里的每一个数字,我们需要把他们都放到sb里,在去调用helper函数,helper(result, sb, digits),然后再删除sb的最后一个元素

function digitsToCharts(n) {
    switch(n) {
        case "2":
        return ["a", "b", "c"]
        case "3":
        return ["d", "e", "f"]
        case "4":
        return ["g", "h", "i"]
        case "5":
        return ["j", "k", "l"]
        case "6":
        return ["m", "n", "o"]
        case "7":
        return ["p", "q", "r", "s"]
        case "8":
        return ["t", "u", "v"]
        case "9":
        return ["w", "x", "y", "z"]
        default: 
        return []
    }
}
var letterCombinations = function(digits) {
    let result = []
    if (digits == null || digits.length === 0) {
        return result
    }
    let sb = ''
    helper(result, sb, digits)
    return result
};
let helper = function(result, sb, digits) {
    if (sb.length === digits.length) {
        result.push(sb)
        return
    }
    for (let ch of digitsToCharts(digits[sb.length])){
        sb = sb.concat(ch)
        helper(result, sb, digits)
        sb = sb.substring(0, sb.length - 1)
    }
}