【Leetcode】22. Generate Parentheses

【Leetcode】22. Generate Parentheses_第1张图片

我的代码实现(Python):

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        if n == 0:
            return []
        l = []
        res = []
        self.a(res, l, n)
        return res

    def a(self, res, l, n):
        if len(l) == 2 * n:
            l = ''.join(l)
            res.append(l)
            return
        if self.leftValid(l, n):
            l.append('(')
            self.a(res, l, n)
            l.pop()

        if self.rightValid(l):
            l.append(')')
            self.a(res, l, n)
            l.pop()

    def leftValid(self, l, n):
        left_count = l.count('(')
        if left_count == n:
            return False
        return True

    def rightValid(self, l):
        left_count = l.count('(')
        right_count = l.count(')')
        if left_count > right_count:
            return True
        return False

其实这个题很简单,用个递归就可以完成,不过早上写完代码之后一直有问题,折腾了一天,直到刚才才搞定。原来是在a函数里我本来写了个l_copy=l,然后l给self.leftValid,l_copy给self.rightValid,然后一直搞不明白咋回事,想法没问题啊,代码实现也没问题啊,怎么最后就只输出一个解呢!发现问题的时候恍然大悟,l_copy是对l的浅拷贝,对l的操作也会引起l_copy的改变,这是问题所在!对Python使用还是不熟啊!

最后看了下琨哥的代码,比我的简洁多了!

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        if n==0:
            return []
        res = []
        self.helpler(n,n,'',res)
        return res
    
    def helpler(self,l,r,item,res):
        if l>r:
            return
        if l==0 and r==0:
            res.append(item)
        if l>0:
            self.helpler(l-1, r, item+'(', res)
        if r>0:
            self.helpler(l, r-1, item+')', res)

都是递归,区别在于他的递归会生成所有的组合可能,然后判断,如果非法即返回;而我的是先判断,如果在加一个合法,那就加,如果非法那就不加。打个比喻,他是先进门,看看屋里危险与否,如果危险那就出来;我的是现在门口张望,如果屋里危险那就不进了,安全才进。

按道理讲,我的算法效率应该更高,因为我不会生成所有组合可能。但是执行时间我的是70ms左右,而他的是50ms左右,我想我的代码实现耗时就耗时在函数rightValid ()这,因为它会计算()的个数,且对结果的保存最开始list,最后又有个转换。

你可能感兴趣的:(【Leetcode】22. Generate Parentheses)