leetcode-电话号码组合

759 阅读1分钟

题目描述:

题目地址:电话号码组合

for循环

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function (s) {
  if (!s.length) return [];
  const char = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
  let res = [''];
  for (let a of s) {
    let now = [];
    for (let b of char[a - 2])
      for (let c of res) now.push(c + b);
    res = now;
  }
  return res;
};

递归

  • 考点:卡迪尔积
  • 实现一个简单的卡迪尔积
var a = ['a', 'b', 'c'], b = ['e', 'f', 'g']; 
// a * b = res ? 求解这两个集合的笛卡尔积
var res = ['ae', 'af', 'ag', 'be', 'bf', 'bg', 'ce', 'cf', 'cg'];
function flatMap(fn, array) {
    return array.map(fn).flat(1);
}
flatMap(item1 => flatMap(item2 => item1 + item2, a), b);
  • cartesian -> 笛卡尔

代码

/**
 * @param {string} digits
 * @return {string[]}
 */
const letterCombinations = function (digits) {
  function cartesianProduct(sets) {
    // 一直取出数组head,直到sets为空
    const head = sets.shift() || [];
    if (sets.length === 0) return head;

    const tailProduct = cartesianProduct(sets);
    return flatMap(
      item => flatMap(
        items => item + items,
        tailProduct
      ),
      head
    );
  }

  function flatMap(fn, array) {
    return [].concat(...array.map(fn));
    // return array.map(fn).flat(1);
    // leetcode 暂不支持flat(1)语法,将就用下[].concat()
  }
  const obj = {
    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 len = digits.length;
  const res = [];
  for (let i = 0; i < len; i++) {
    res.push(obj[digits.charAt(i)]);
  }
  return cartesianProduct(res);
};

const res = letterCombinations('245');
console.log(res);