1. 合法括號深度
一個合法的括號匹配序列有以下定義:
1、空串""是一個合法的括號匹配序列
2、如果"X"和"Y"都是合法的括號匹配序列,"XY"也是一個合法的括號匹配序列
3、如果"X"是一個合法的括號匹配序列,那麼"(X)"也是一個合法的括號匹配序列
4、每個合法的括號序列都可以由以上規則生成。
例如: "","()","()()","((()))"都是合法的括號序列
對於一個合法的括號序列我們又有以下定義它的深度:
1、空串""的深度是0
2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那麼字符串"XY"的深度爲max(x,y) 3、如果"X"的深度是x,那麼字符串"(X)"的深度是x+1
例如: "()()()"的深度是1,"((()))"的深度是3。牛牛現在給你一個合法的括號序列,需要你計算出其深度。
def depth(s):
left = 0
res = 0
for i in range(len(s)):
if s[i] == '(':
left += 1
res = max(left, res)
else:
left -= 1
return res
2. 補充缺失括號
一個完整的括號字符串定義規則如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那麼(s)也是完整的。
3、如果s和t是完整的字符串,將它們連接起來形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括號字符串,"())(", "()(" 和 ")"是不完整的括號字符串。
牛牛有一個括號字符串s,現在需要在其中任意位置儘量少地添加括號,將其轉化爲一個完整的括號字符串。請問牛牛至少需要添加多少個括號。
def valid(s):
left = 0 #需要與之匹配的左括號個數
right = 0 #需要與之匹配的右括號個數
for i in range(len(s)):
if s[i] == '(':
left += 1
if s[i] == ')':
if left == 0:
right += 1
else:
left -= 1
return left + right
3. 有效的括號
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
left = []
right = []
for i in range(len(s)):
if s[i] in ["(","[","{"]:
left.append(s[i])
else:
right.append(s[i])
if left == []:
return False
if (s[i] == ')' and left[-1] == '(') or (s[i] == ']' and left[-1] == '[') or (s[i] == '}' and left[-1] == '{'):
left.pop()
right.pop()
if left == [] and right == []:
return True
else:
return False
4. 最長有效括號(dp)
給定一個只包含 '('
和 ')'
的字符串,找出最長的包含有效括號的子串的長度。
class Solution:
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
if s == '':
return 0
dp = [0 for i in range(len(s))]
for i in range(1,len(s)):
index = i-dp[i-1]-1
if index >= 0 and s[i] == ')' and s[index] == '(':
dp[i] = dp[i-1] + 2
if index - 1 > 0:
dp[i] += dp[index-1]
return max(dp)
5. 生成括號
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
class Solution:
def __init__(self):
self.list = []
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
if n == 0:
return ''
self.generate('',self.list,n,n)
return self.list
def generate(self, sub, l, left, right):
if left > right:
return
if left > 0:
self.generate(sub + '(', self.list, left-1, right)
if right > 0:
self.generate(sub + ')', self.list, left, right-1)
if left == 0 and right == 0:
self.list.append(sub)
return
6. 使括號有效的最少添加
https://leetcode-cn.com/problems/minimum-add-to-make-parentheses-valid/
給定一個由 '('
和 ')'
括號組成的字符串 S
,我們需要添加最少的括號( '('
或是 ')'
,可以在任何位置),以使得到的括號字符串有效。
從形式上講,只有滿足下面幾點之一,括號字符串纔是有效的:
- 它是一個空字符串,或者
- 它可以被寫成
AB
(A
與B
連接), 其中A
和B
都是有效字符串,或者 - 它可以被寫作
(A)
,其中A
是有效字符串。
給定一個括號字符串,返回爲使結果字符串有效而必須添加的最少括號數。
class Solution(object):
def minAddToMakeValid(self, S):
"""
:type S: str
:rtype: int
"""
#每遇到一次不合法(沒有左括號匹配當前右括號),結果就加一
num= 0
res = 0
for item in S:
if num < 0:
res += 1
num = 0
if item == "(":
num += 1
else:
num -= 1
#最後若num不爲0,則剩餘的也是不合法的
res += abs(num)
return res