一、回溯的定义
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:
- 路径:也就是已经做出的选择。
- 选择列表:也就是你当前可以做的选择。
- 结束条件:也就是到达决策树底层,无法再做选择的条件。
代码方面,回溯算法的框架:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
由上可知,一般我们会使用栈来配合使用来进行回溯操作,所以一般是递归+栈
二、 例题解析
leetcode 17题 电话号码字母的组合
示例:
- 输入:“23”
- 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
class Solution:
def __init__(self):
self.dic = {
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz"
}
self.length = 0
self.res = []
self.digits = None
# 递归函数
def solution(self, curr, nextStrIndex):
# 结束条件,出口
if(nextStrIndex >= self.length):
self.res.append("".join(curr))
return
# 取选择列表
tmpStr = self.dic[self.digits[nextStrIndex]]
strLen = len(tmpStr)
# 遍历递归
for i in range(strLen):
curr.append(tmpStr[i]) # 做选择
self.solution(curr,nextStrIndex + 1)
curr.pop() # 撤销选择
def letterCombinations(self, digits: str) -> List[str]:
if(not digits or len(digits) == 0):
return []
self.digits = digits
self.length = len(digits)
self.solution([],0)
return self.res
写在最后
如果觉得本文对你有帮助的话,可以为我点个赞哈,你的关注和支持是我坚持下去最大的鼓励。
对文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。