回溯法也可以叫回溯搜索法,一种搜索的方式
回溯是递归的副产品,只要有递归就会有回溯
回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案
组合是不强调元素的顺序的,排列是强调元素顺序
回溯法解决的问题可以抽象为树形结构。
回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,构成树的深度
思路
startIndex 记录下一层递归,搜索的起始位置
问题
注意 把数组加入数组时,得用深拷贝
电话号码的字符组合
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
const k = digits.length
if(!k) return []
if(k===1) return map[digits].split("")
const result = [],path = []
// a 下标 n 传入的字符串
let backtracking = (n,k,a)=>{
if(path.length===k){
result.push(path.join(""))//把数组转成字符串
return
}
// console.log(map["23"[0]]); 先运算"23"[0] 拿到2 再map[2] 拿到2 对应的字母组合
for(const v of map[n[a]]){
path.push(v)
backtracking(n,k,a+1)
path.pop()
}
}
backtracking(digits,k,0)
return result
}
问题
map["23"[0]] 先算里面的
可以直接log输出来看的,如果csdn查不到的话