bobo老师你好,我想问关于backtracking、DFS和DP的两个问题。
1)在我的理解当中,这几类题:a)通常求极值(包括最大最小值,最长最短等,例如leetcode第5题最长回文子串),b)某个方案可行不可行(比如leetcode第139题word break等),c)以及一些distinct的方案的总数(比如第60题Unique Path,第70题Climb Stairs等);然后backtracking的题通常都是用来解所有排列组合的题(比如第10题Regular Expression Matching 以及一堆Permutation Combination Subsets相关的题)。
然后我今天做93-Restore IP Addresses的时候,审题的时候如下
然后突然想到70-Climbing Stairs,如下图
这两道题代码部分我能看懂也能写,但是对回溯法和DP深层次的理解有问题,你看红框和红线的部分,比如93题是求“所有”组成的可能性,70题是求“所有”不一样(distinct)的路径,都是求“所有”的解决方案,为什么93题是用回溯法,70题则是动态规划?这两个“所有”有什么区别?当我遇到新的没见过的算法题的时候,如何才能甄别该用上面写的第c类的DP问题或者是用回溯法呢?
2)回溯法和DFS的区别是什么?我查了一些资料(比如这个链接:https://stackoverflow.com/questions/1294720/whats-the-difference-between-backtracking-and-depth-first-search),
说回溯法是思想,DFS是其中的一种实现,我的理解是回溯法是每个解法都去试试,不行就返回,中间不保存树形结构;而DFS则会保留树形结构,避免重复计算。请问这个理解有没有错误?有没有别的更好的理解方式呢?
非常感谢!