电话键盘按键的字母组合

时间:2018-12-18 20:37:00

标签: javascript recursion dfs

我对JavaScript中电话键盘按键的字母组合有疑问。我使用DFS递归编写了一个解决方案。但是它没有按预期工作。我是JavaScript的新手,但在Ruby中类似地编写了代码。

问题在于如何从电话键盘上获取所有可能的字母组合。

输入:“ 23”

输出:[“ ad”,“ ae”,“ af”,“ bd”,“ be”,“ bf”,“ cd”,“ ce”,“ cf”]。

使用下面的代码,它在“ af”处停止。输出为[“ ad”,“ ae”,“ af”]。我不确定为什么此代码不会移到第二个字母“ 2”,即“ b”。

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"]
};

let result = [];

let letterCombinations = function(digits) {
  if (digits.length == 0) {
    return []
  };

  let stack = [];
  dfs(digits.split(''), 0, stack)

  return result
};

function dfs(digits, index, stack) {
  const currentLetters = map[digits[index]]

  for (i = 0; i < currentLetters.length; i++) {
    stack.push(currentLetters[i])

    if (index == digits.length - 1) {
      result.push(stack.join(''))
      stack.pop()
    } else {
      dfs(digits, index + 1, stack)
      stack.pop()
    }
  }
}

console.log(letterCombinations("23"));

2 个答案:

答案 0 :(得分:5)

您需要在for循环中声明i,否则它是全局的,并且在每个递归步骤中都会不断增加。

使用for (let i = 0; i < currentLetters.length; i++)

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"]
};

let result = [];

let letterCombinations = function(digits) {
  if (digits.length == 0) {
    return []
  };

  let stack = [];
  dfs(digits.split(''), 0, stack)

  return result
};

function dfs(digits, index, stack) {
  const currentLetters = map[digits[index]]
  
  // declare the loop variable!
  for (let i = 0; i < currentLetters.length; i++) {
    stack.push(currentLetters[i])

    if (index == digits.length - 1) {
      result.push(stack.join(''))
      stack.pop()
    } else {
      dfs(digits, index + 1, stack)
      stack.pop()
    }
  }
}

console.log(letterCombinations("23"));

答案 1 :(得分:0)

这是一个不太复杂的实现。我希望您觉得它有用!

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"]
};

function letterCombinations(digits) {
  digits = digits.split('');
  
  const firstArray = map[digits[0]];
  const secondArray = map[digits[1]];
  const result = [];
  
  for (let i = 0; i < firstArray.length; i++)
  {
    for (let j = 0; j < secondArray.length; j++)
    {
      result.push(firstArray[i] + secondArray[j]);
    }
  }
  
  return result;
};

console.log(letterCombinations("23"));