leetcode32 最長有效括號(Hard)
阿新 • • 發佈:2020-07-12
題目來源:leetcode32 最長有效括號
題目描述:
給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"
解題思路:
參考題解
使用動態規劃,dp[i]定義為:以s[i]為結尾的子串中,形成的最長有效子串的長度。dp[0]=0。
-
如果s[i]是')',判斷s[i-1]
① s[i-1]是'('
如果i-2>=0 ,那麼dp[i]=dp[i-1]+2;否則dp[i]=2;
②s[i-1]是')'
以s[i-1]為結尾形成的最長有效長度為dp[i-1],跨過這個長度(裡面細節不用管,總之它最大能提供dp[i-1]長度),來看s[i-dp[i-1]-1]這個字元:
s[i-dp[i-1]-1]不存在或為')',s[i]找不到匹配,直接gg,dp[i] = 0
s[i-dp[i-1]-1]是'(',它和s[i]呼應,有效長度 2 保底,加上跨過的dp[i-1],再加上前方的dp[i-dp[i-1]-2]…等等…s[i-dp[i-1]-2]要存在才行
s[i-dp[i-1]-2]存在,dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2
s[i-dp[i-1]-2]不存在,dp[i] = dp[i-1] + 2 -
如果s[i]是'(',不能構成有效子串,dp[i]=0;
class Solution { public: int longestValidParentheses(string s) { int n=s.size(); vector<int> dp(n,0); int ans=0; for(int i=1;i<n;i++){ if(s[i]==')'){ if(s[i-1]=='('){ if(i-2>=0) dp[i]=dp[i-2]+2; else dp[i]=2; } else { if(i-dp[i-1]-1>=0&&s[i-dp[i-1]-1]=='('){ if(i-dp[i-1]-2>=0) dp[i]=dp[i-dp[i-1]-2]+dp[i-1]+2; else dp[i]=dp[i-1]+2; } } } else dp[i]=0; ans=max(ans,dp[i]); } return ans; } };