题目:给定一个只包含数字2-9的字符串,返回所有它能表示的字母组合,给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母
思路:
<script>
const letterCombinations = str => {
//建立电话号码键盘映射
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
// 把输入字符串按单字符分隔,变成数组 234=》[2,3,4]
let num = str.split(''); //分隔字符
// 保存键盘映射后的字母内容, 如23 => ['abc', 'def']
let code = [];
//循环遍历
num.forEach(item => {
if (map[item]) {
code.push(map[item]);
}
})
//两两组合
let comb = arr => {
//临时变量,用来保存前两个组合的结果
let tmp = [];
//最外层的循环是遍历第一个元素,里层循环是遍历第二个元素
for (let i = 0, il = arr[0].length; i < il; i++) {
for (let j = 0, jl = arr[1].length; j < jl; j++) {
//保存第一个元素的第i个字符、保存第2个元素的第j个字符
tmp.push(`${arr[0][i]}${arr[1][j]}`);
}
}
//前两个元素组合完后先“扔掉”,用临时变量去替换;
// 替换后用前两个的结果去和下一个再次进行两两组合,以此类推
arr.splice(0, 2, tmp);
//判断能否进行两两组合,如果可以就进行递归操作,否则就直接返回tmp
if (arr.length > 1) {
comb(arr);
} else {
return tmp;
}
return arr[0];
}
return comb(code);
}
console.log(letterCombinations('38'));
</script>