給定一個只包含 '('
和 ')'
的字符串,找出最長的包含有效括號的子串的長度聋庵。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"
思路:
從左向右找而姐,只處理)括號腊凶,判斷起點位置left,如果前1位的dp有值拴念,那么起點就應再減去長度钧萍,即left = i - 1 - dp[i - 1],如果left>=0并且起點left為(時政鼠,當前dp長度為dp[i-1]+2风瘦;另外,如果left的前一位也有值公般,表示字符前面還能連起來万搔,所以還要加上前面的長度,即dp[i] += dp[left -1]
class Solution:
def longestValidParentheses(self, s):
if not s:
return 0
dp = [0 for _ in range(len(s))]
for i in range(1, len(s)):
if s[i] == ')':
# 判斷起點位置為前1位官帘,如果前1位的dp有值起點就為再減去長度
left = i - 1 - dp[i - 1]
# 如果起點大于等于0瞬雹,并且起點為(,則長度為前1個長度+2
if left >= 0 and s[left] == '(':
dp[i] = dp[i - 1] + 2
# 如果起點前1位dp有值刽虹,說明要算上前面的長度
if left - 1 >= 0:
dp[i] += dp[left - 1]
print(dp)
res = max(dp)
return res