給定一個只包含 '(' 和 ')' 的字串,找出其中包含的最長的有效括號子字串的長度。
範例1:
Input: s = "(()"
Output: 2
Explanation: 最長的有效括號子字串是 "()",長度為 2。
範例2:
Input: s = ")()())"
Output: 4
Explanation: 最長的有效括號子字串是 "()()",長度為 4。
範例3:
Input: s = ""
Output: 0
我們可以使用堆疊來追蹤括號的索引。堆疊的初始狀態是放入一個基準值 -1
,用來計算有效括號的長度。
-1
。(
,將其索引推入堆疊。)
:class Solution:
def longestValidParentheses(self, s: str) -> int:
stack = [-1]
max_length = 0
for i, char in enumerate(s):
if char == '(': # 左括號
stack.append(i)
else: # 右括號
stack.pop()
if not stack: # 如果堆疊為空,更新基準索引
stack.append(i)
else: # 計算當前有效括號長度
max_length = max(max_length, i - stack[-1])
return max_length
動態規劃的思路是使用一個陣列 dp
,其中 dp[i]
表示以下標 i
為結尾的最長有效括號的長度。
n
的陣列 dp
,所有元素初始為 0
。)
,檢查其前一字符:dp
陣列中的最大值。class Solution:
def longestValidParentheses(self, s: str) -> int:
n = len(s)
if n == 0:
return 0
dp = [0] * n
max_length = 0
for i in range(1, n):
if s[i] == ')':
if s[i-1] == '(':
dp[i] = dp[i-2] + 2 if i >= 2 else 2
elif i - dp[i-1] - 1 >= 0 and s[i - dp[i-1] - 1] == '(':
dp[i] = dp[i-1] + (dp[i-dp[i-1]-2] if i-dp[i-1]-2 >= 0 else 0) + 2
max_length = max(max_length, dp[i])
return max_length
dp
陣列。我們可以使用雙指針分別從左到右和從右到左遍歷字串,計算有效括號的長度。
left
和 right
,分別計算左括號和右括號的數量。(
,增加 left
。)
,增加 right
。left == right
,計算當前有效括號長度。right > left
,重置計數器。left
和 right
的計算順序。class Solution:
def longestValidParentheses(self, s: str) -> int:
left = right = max_length = 0
# 從左到右遍歷
for char in s:
if char == '(':
left += 1
else:
right += 1
if left == right:
max_length = max(max_length, 2 * right)
elif right > left:
left = right = 0
left = right = 0
# 從右到左遍歷
for char in reversed(s):
if char == ')':
right += 1
else:
left += 1
if left == right:
max_length = max(max_length, 2 * left)
elif left > right:
left = right = 0
return max_length
根據實際需求選擇合適的解法。如果需要處理長度較大的字串且對空間要求較高,雙指針法是最佳選擇。