携手创作,共同成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
电话号码的字母组合
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射与电话按键相同。注意 1 不对应任何字母。
分析
- 要返回所有的字母组合,那需要对字符串的字符进行遍历,拿到对应的字母映射,然后分情况枚举,选一种情况一路走到黑,深度优先,字母排列完成后,返回上一个状态,如果有其他情况就使用继续枚举其他情况,如果没有就再返回上一个状态,一直遍历完所有状态,就可以得到所有字母组合,所以DFS可以解决问题,纯DFS不记录过程,也就是中间态,所以在DFS的时候,加一个参数来记录搜索过程中的中间状态,当得到符合要求的字母组合状态时,用数组维护起来,得到最后的答案
DFS+回溯
- 首先确定数字-字母映射
- 确定DFS思想,再加上记录中间过程的参数,确定DFS函数的意义,dfs(p,str)即字符串遍历到p位置的时候,得到的字母组合是str
- 维护字母组合数组,DFS搜索到符合情况的状态时,就把这个答案加入到数组中,DFS搜索完,这个数组就是最终的答案
代码
const map = {'2':"abc",'3':"def",'4':"ghi",'5':"jkl",
'6':"mno",'7':"pqrs",'8':"tuv",'9':"wxyz"}
var letterCombinations = function(digits) {
let len = digits.length, ans = []
if (!len) return []
const dfs = (pos, str) => {
if (pos === len) ans.push(str)
else {
let letters = map[digits[pos]]
for (let i = 0; i < letters.length; i++)
dfs(pos+1,str+letters[i])
}
}
dfs(0,"")
return ans
};
总结
- 对于这种题目的解题方法到底是DFS还是回溯,比较倾向于使用DFS+回溯来说明,在解决这种题目时使用的DFS和纯DFS的功能不同,同时回溯算法又叫试探法,回溯试探的思想就是深度优先的思想,所以也就不用区别到底是什么算法了,算法是为解决问题服务的
- 今天也是有收获的一天