leetcode -- 20.有效的括号,括号的生成----括号问题

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

 1 class Solution(object):
 2     def isValid(self, s):
 3         """
 4         :type s: str
 5         :rtype: bool
 6         """
 7         dic = {')':'(', ']':'[', '}':'{'}
 8         stack = []
 9         for i in s:
10             if i in dic.values():#如果元素i为左括号,将其存入栈
11                 stack.append(i)
12             elif i in dic.keys():#如果是右括号
13                 if stack==[] or dic[i] != stack.pop():#右括号的情况,如果栈内此时无元素,说明顺序错误,如果该右括号对应的左括号与栈的最后一个元素不匹配,括号匹配错误
14                     return Faslse
15             else:
16                 return False
17         return stack == []#最终所有括号完全匹配时,栈是pop被取空的

 括号的生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
 1 class Solution(object):
 2     def generateParenthesis(self, n):
 3         """
 4         :type n: int
 5         :rtype: List[str]
 6         """
 7         #采用深度优先遍历的方式dfs来解决
 8         if not n:
 9             return []
10         l, r, strs, ans = n, n, '', []
11         self.dfs(strs, l, r, ans)
12         return ans
13     def dfs(self, strs, l, r, ans):
14         if l>r:#排除不一一配对情况
15             return
16         if not l and not r:#当l,r都为0的时候,一种情况完成
17             ans.append(strs)
18             return
19         if l:
20             self.dfs(strs+'(', l-1, r, ans)
21         if r:
22             self.dfs(strs+')', l, r-1, ans)

 

posted @ 2019-02-25 11:56  夜雨声入眠  阅读(121)  评论(0编辑  收藏  举报