回溯法

回溯法的本质是一个基于深度优先搜索(DFS)的穷举的过程

  1. 添加值
  2. 判定现有结果是否满足条件
  3. DFS
  4. 回退

简单回溯法的使用

  • 问题:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点 开始往下一直到叶结点所经过的结点形成一条路径。

  • 解决:

    class Solution:
        # 返回二维列表,内部每个列表表示找到的路径
        def FindPath(self, root, expectNumber):
            path, spare = [],[]
            def recur(root,tar):
                if not root:
                    return
                spare.append(root.val)
                tar -= root.val
                if not root.left and not root.right and tar == 0:
                    path.append(list(spare))
                recur(root.left, tar)#深度遍历
                recur(root.right, tar)
                spare.pop() #回溯
            recur(root,expectNumber)
            return path
    

字符串的排列

  • 问题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

  • 解决:

    class Solution:
        def Permutation(self, ss):
            # write code here
            res = []
            cache = list(ss)
            def recur(x):
                if x == len(cache)-1:
                    res.append("".join(cache))
                    return
                dic = []
                for i in range(x,len(cache)):
                    if cache[i] in dic: continue
                    dic.append(cache[i])
                    cache[i], cache[x] = cache[x], cache[i]
                    recur(x+1)
                    cache[i], cache[x] = cache[x], cache[i]
            recur(0)
            return sorted(res)
    
posted @ 2020-07-28 20:19  guguda  阅读(141)  评论(0)    收藏  举报