这是我参与更文挑战的第16天,活动详情查看: 更文挑战
题目描述
电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
// 示例1
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
// 示例2
输入:digits = "2"
输出:["a","b","c"]
复制代码
标签
DFS回溯
解题分析
1. DFS回溯
直接上讲解。
核心就是回溯,当搜索中达不到符合的结果时,就回溯回根节点,开始下一个回溯。
不过在这题中没有体现,直接暴力搜索就行。
假设传入的字符串时 '234'
2: [a,b,c]
3: [d,e,f]
4: [g,h,i]
直接暴力搜索
以0为起始,开始遍历递归。
string[0] => [a,b,c]
然后以0中的每个数字为节点,继续递归整个字符串
a => 跑到第n+1个数据中遍历, ad, ae, af, 再跑到n+2个数据中,
adg, adh, adi,
aeg, aeh, aei,
afg, afh, afi
直到最后,当所有数据集跑完,没有数据了再返回数组并退出当前递归。
每一个节点相当于一个递归跑起来!
复制代码
来人上代码!!!!!
function letterCombinations(digits: string): string[] {
if(digits.length === 0) return []
const result: string[] = []
const map = new Map([
['2', 'abc'],
['3', 'def'],
['4', 'ghi'],
['5', 'jkl'],
['6', 'mno'],
['7', 'pqrs'],
['8', 'tuv'],
['9', 'wxyz'],
])
// 空字符串,指针
const dfs = (cur, i) => {
//这题没有特殊条件,当遍历完数据集就可以退出了
if(i > digits.length - 1) {
result.push(cur)
return
}
// 以每个数据集中的数据来进行递归
const curNum = map.get(digits[i])
for(let num of curNum) {
dfs(cur + num, i+1)
}
}
// 以0 第一个数据集为起点
dfs('', 0)
return result
};
复制代码
最后
从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100
,第八道题目打完收工!!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END