我对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"));
答案 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"));