最近leetcode刷题遇到了许多和回溯法有关的题,然而对回溯法完全没有过系统的了解明显感觉费力了很多狠心打算一次把回溯法弄懂,开个贴记录一下学习过程
回溯法的基本模板
class solution:
def solvepermutation(self,*arg,**kwg):
pass #初始化输入输出内容
#定义helper函数,构建回溯主体
def helper(self,array,solution):
pass
solution().solvepermutation(*arg)
回溯和递归动态规划有点相似
相似点:都是需要调用自身,将完整问题分部解决
不同点:递归是自顶向下 动态规划是自下向上 两者都是单一方向的
而回溯法在不满足条件是,会回溯到上一个满足条件的位置调整参数继续执行
对于回溯算法的使用,首先要确定两个条件:
1.循环终止条件,即满足什么条件时,整个程序终止并输出结果
2.回溯条件,即满足什么条件时,回溯到上一个状态,否则继续进行循环
例题1.
找单词,即在一个字母矩阵中寻找特定的单词
按照常规思考方式,首先两个for循环历遍所有的字母,首先找到单词的首字母
,然后对其规定的方向,寻找剩余字母,直到找到完整的单词。
对于这个问题 首先我们确立上述的两个条件
1.循环终止条件:找到完整单词则循环终止。那如何用代码表示呢。可以将单词存在一个字符串中,每按顺序找到一个字母,则在字符串中删去该字母。当字符串长度为0时,则终止循环
2.回溯条件:即当前位置所有方向都找不到下一个字母时,回溯到上一个位置,换一个方向继续寻找
然后要思考如何将该问题拆分成若干步,很简单,我们每次只寻找一个字母,而不是查找完整的单词。
class Solution():
def run(self,board,words):
#两个for循环历遍整个矩阵
for i in range(len(board)):
for j in range(len(board[0])):
if self