内功修炼——回溯

一、回溯的定义

解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:

  1. 路径:也就是已经做出的选择。
  2. 选择列表:也就是你当前可以做的选择。
  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

写在最后

如果觉得本文对你有帮助的话,可以为我点个赞哈,你的关注和支持是我坚持下去最大的鼓励。

对文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

发布了13 篇原创文章 · 获赞 13 · 访问量 636

猜你喜欢

转载自blog.csdn.net/coding_sleep/article/details/105296151