leetcode -- 20.有效的括号,括号的生成----括号问题
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
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 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 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)