思路
比较明显,也没有剪枝的直观深搜。
这类深搜主要是确定函数的入参,需要记录的有三个:
- 全局答案数据数组res,类型为字符串数组;
- 当前搜索的数字串digits,类型为字符串;
- 当前拼成的字符串curStr,类型为字符串;
边界:当目前搜索的数字串digits为空时,就到了边界,可以把目前拼好的字符串加入res。
搜索过程:将digits的第一个数字对应的字母串取出,然后依次将字符串中的字符拼接在curStr后,截掉digits当前数字(第一号数字)后继续搜索。
代码
function letterCombinations(digits: string): string[] {
const res: string[] = [];
const symbols = ['abc','def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
const numToSymbolMap = new Map<number, string>();
for (let i = 2; i <= 9; i++) {
numToSymbolMap.set(i, symbols[i-2]);
}
// 空串特判
if (!digits.length) return res;
function backtrace(res: string[], digits: string, curStr: string): void {
if (!digits.length) {
res.push(curStr);
return ;
}
let letters: string = numToSymbolMap.get(Number(digits[0]))!;
for(let i = 0; i < letters.length; i++) {
backtrace(res, digits.slice(1), curStr + letters[i]);
}
}
backtrace(res, digits, '');
return res;
}
console.log(letterCombinations('23'));