[LeetCode17. 电话号码的字母组合] | 刷题打卡

129 阅读1分钟

题目描述:

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

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

示例:

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

输入:digits = ""
输出:[]

输入:digits = "2"
输出:["a","b","c"]

方法分析:

主要考察map、递归等

方法:

  • 递归版本

    var letterCombinations = function(digits) {
      const constract = [, , 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
      if (digits.length === 0) return []
      if (digits.length === 1) return constract[digits[0]].split('')
      let result = constract[digits[0]].split('')
      let recursion = (i) => {
        if (!digits[i]) return result
        let cur = constract[digits[i]].split('')
        let newArr = []
        for (let i = 0, len1 = result.length; i < len1; i++) {
          for (let j = 0, len2 = cur.length; j < len2; j++) {
            newArr.push(`${result[i]}${cur[j]}`)
          }
        }
        result = newArr
        return recursion(i + 1)
      }
      return recursion(1)
    };
    
  • map

    let map = {
        2: 'abc',
        3: 'def',
        4: 'ghi',
        5: 'jkl',
        6: 'mno',
        7: 'pqrs',
        8: 'tuv',
        9: 'wxyz'
      };
    
    
      let letterCombinations = function (digits) {
        let n = digits.length;
        call(0, n, digits, '');
    
      };
    
      let call = function (num, length, digits, str) {
        if (num === length) {
          console.log(str);
          return;
        }
        let tar = map[digits[num]]
        for (let i = 0; i < tar.length; i++) {
          call(num + 1, length, digits, str + tar[i]);
        }
      }
    

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情