leetcode32. 最長有效括號(棧)
阿新 • • 發佈:2021-11-13
連結:https://leetcode-cn.com/problems/longest-valid-parentheses/
題目
給你一個只包含 '('和 ')'的字串,找出最長有效(格式正確且連續)括號子串的長度。
示例 1:
輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"
示例 2:
輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"
示例 3:
輸入:s = ""
輸出:0
提示:
0 <= s.length <= 3 * 104
s[i] 為 '(' 或 ')'
思路
方法一
用棧記錄左括號 dp陣列記錄能達到的最長合法字串
class Solution { public: int longestValidParentheses(string s) { int n=s.size(); if(n<2) return 0; vector<int>dp(n); vector<bool>iscons(n,false); stack<int>st; for(int i=0;i<n;++i){ if(s[i]==')'){ if(st.empty()) continue; else{ iscons[i]=true; int t=st.top(); st.pop(); if(t>0&&s[t-1]==')'&&iscons[t-1]==true) dp[i]=dp[t-1]+i-t+1; else dp[i]=i-t+1; } }else{ st.push(i); } } return *max_element(dp.begin(),dp.end()); } };
方法二
只記錄左括號等於右括號的形式,但是特殊情況“(()”無法識別,故可以左右各進行一次,取最大
class Solution { public: int longestValidParentheses(string s) { int n=s.size(); int left=0,right=0,ans=0; for(int i=0;i<n;++i){ if(s[i]=='(')left++; else right++; if(left==right) ans=max(ans,2*left); else if(right>left)left=0,right=0; } left = 0, right = 0; for(int i=n-1;i>=0;--i){ if(s[i]==')')right++; else left++; if(left==right) ans=max(ans,2*right); else if(left>right)left=0,right=0; } return ans; } };