32. Longest Valid Parentheses 最长有效括号
Title
給定一個(gè)只包含 ‘(’ 和 ‘)’ 的字符串,找出最長(zhǎng)的包含有效括號(hào)的子串的長(zhǎng)度。
示例 1:
輸入: “(()”
輸出: 2
解釋: 最長(zhǎng)有效括號(hào)子串為 “()”
示例 2:
輸入: “)()())”
輸出: 4
解釋: 最長(zhǎng)有效括號(hào)子串為 “()()”
棧
Solve
括號(hào)匹配問(wèn)題,第一個(gè)想到的數(shù)據(jù)結(jié)構(gòu)就是棧,考慮到邊界情況,要保持棧底元素為當(dāng)前已經(jīng)遍歷過(guò)的元素中最后一個(gè)沒(méi)有被匹配的右括號(hào)的下標(biāo),初始情況放入-1,棧里其他元素維護(hù)左括號(hào)的下標(biāo)。
具體過(guò)程:
- 如果遇到左括號(hào),將其下標(biāo)放入棧中
- 如果遇到右括號(hào):
- 如果棧為空,說(shuō)明當(dāng)前的右括號(hào)為沒(méi)有被匹配的右括號(hào),我們將其下標(biāo)放入棧中來(lái)更新我們之前提到的「最后一個(gè)沒(méi)有被匹配的右括號(hào)的下標(biāo)」
- 如果棧不為空,當(dāng)前右括號(hào)的下標(biāo)減去棧頂元素即為「以該右括號(hào)為結(jié)尾的最長(zhǎng)有效括號(hào)的長(zhǎng)度」
Code
def longestValidParentheses_stack(self, s: str) -> int:stack, ans = [-1], 0for i in range(len(s)):if s[i] == '(':stack.append(i)else:stack.pop()if not stack:stack.append(i)else:ans = max(ans, i - stack[-1])return ans復(fù)雜度分析
時(shí)間復(fù)雜度: O(n),n 是給定字符串的長(zhǎng)度。我們只需要遍歷字符串一次即可。
空間復(fù)雜度: O(n)。棧的大小在最壞情況下會(huì)達(dá)到 n,因此空間復(fù)雜度為 O(n) 。
動(dòng)態(tài)規(guī)劃
Solve
定義dp數(shù)組并全部初始化為0,dp[i]表示以下標(biāo)i字符結(jié)尾的最長(zhǎng)有效括號(hào)的長(zhǎng)度。
有效子串一定以右括號(hào)結(jié)尾,所有以左括號(hào)結(jié)尾的子串對(duì)應(yīng)的dp值必定為0。
從前往后遍歷字符串求解dp值,每?jī)蓚€(gè)字符檢查一次:
我們考慮如果倒數(shù)第二個(gè) ‘)’ 是一個(gè)有效子字符串的一部分(記作 subs),對(duì)于最后一個(gè) ‘)’ ,如果它是一個(gè)更長(zhǎng)子字符串的一部分,那么它一定有一個(gè)對(duì)應(yīng)的 ‘(’ ,且它的位置在倒數(shù)第二個(gè) ‘)’ 所在的有效子字符串的前面(也就是 subs 的前面)。
因此,如果子字符串 subs 的前面恰好是 ‘(’ ,那么我們就用 2 加上 subs 的長(zhǎng)度(dp[i?1])去更新 dp[i]。同時(shí),我們也會(huì)把有效子串 “(subs)” 之前的有效子串的長(zhǎng)度也加上,也就是再加上 dp[i?dp[i?1]?2]。
最后的答案即為 dp 數(shù)組中的最大值。
Code
def longestValidParentheses_dp(self, s: str) -> int:length = len(s)if length == 0:return 0dp = [0] * lengthfor i in range(length):if s[i] == ')' and i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(':dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2return max(dp)復(fù)雜度分析
時(shí)間復(fù)雜度: O(n),其中 n 為字符串的長(zhǎng)度。我們只需遍歷整個(gè)字符串一次,即可將 dp 數(shù)組求出來(lái)。
空間復(fù)雜度: O(n)。我們需要一個(gè)大小為 n 的 dp 數(shù)組。
總結(jié)
以上是生活随笔為你收集整理的32. Longest Valid Parentheses 最长有效括号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2.Vue 声明式渲染
- 下一篇: 44. Wildcard Matchin