[python]leetcode(22). Generate Parentheses

来源:互联网 发布:三星系统升级软件 编辑:程序博客网 时间:2024/05/22 12:24

problem

Given n pairs of parentheses, write a function to generate all
combinations of well-formed parentheses.

solution1-回溯法

参考这篇博客的模板,我们可以把括号生成的问题考虑成一颗二叉树遍历问题,对这棵树进行遍历回溯。

class Solution(object):    def backtrack(self, res, tmpstr, left, right, n):        if len(tmpstr) == n*2:            res.append(tmpstr[:])        else:            if left < n:                self.backtrack(res, tmpstr + '(', left + 1, right, n)            if right < left:                self.backtrack(res, tmpstr + ')', left, right + 1, n)    def generateParenthesis(self, n):        res = []        self.backtrack(res, '', 0, 0, n)        return res

这个算法关键是考虑好分支限界问题,分别是

  1. 如果当前左括号数量小于n,则可以继续添加’(‘
  2. 如果当前右括号数量小于左括号数量,则可以继续添加’)’

另外一个和模板不同的地方是之前是操作的list(可变对象),所以直接append和pop很方便、节约内存,而这里的str不可变,所以我们只能传入副本,对原来的tmpstr不进行修改,也就不需要pop了。

solution2-动态规划解法

如何通过f(1)…f(n-1)推出f(n),及如何写出递推方程?

f(n)比f(n-1)多一对括号,因为第一个位置肯定是左括号’(‘,要想放入右括号后括号仍然匹配,就要新加入的左右括号之间有i对匹配的括号,右边有n-i-1对。

f(0): “”

f(1): “(“f(0)”)”

f(2): “(“f(0)”)”f(1), “(“f(1)”)”

f(3): “(“f(0)”)”f(2), “(“f(1)”)”f(1), “(“f(2)”)”

So f(n) = “(“f(0)”)”f(n-1) , “(“f(1)”)”f(n-2) “(“f(2)”)”f(n-3) … “(“f(i)”)”f(n-1-i) … “(f(n-1)”)”

因为,这样算法推出的字符串都满足要求,且f(n)中的匹配形式一定可以拆成这样的形式’(f(i))f(n-i-1)’,所以这个递推方程是正确的。

总结

这种满足一定条件的,序列生成问题一般都可以用回溯法解决。

原创粉丝点击