Буквенные комбинации клавиш клавиатуры телефона - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть вопрос о буквенных сочетаниях клавиш клавиатуры телефона в JavaScript.Я написал решение с использованием рекурсии DFS.Но это не работает, как ожидалось.Я новичок в JavaScript, но аналогично написанный код на Ruby работает.

Проблема в том, чтобы получить все возможные комбинации букв с клавиатуры телефона.

Ввод: "23"

Вывод: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

С кодом ниже, он останавливается на «аф».Вывод: ["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 голосов
/ 19 декабря 2018

Вот менее сложная реализация.Я надеюсь, что вы найдете это полезным!

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"));
0 голосов
/ 19 декабря 2018

Вам необходимо объявить i в цикле for, иначе он будет глобальным и будет увеличиваться на каждом шаге рекурсии.

Использовать 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"));
...