1. 程式人生 > 其它 >[32. 最長有效括號

[32. 最長有效括號

32. 最長有效括號

給你一個只包含 '('')' 的字串,找出最長有效(格式正確且連續)括號子串的長度。

示例 1:

輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"

示例 2:

輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"

示例 3:

輸入:s = ""
輸出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i]'('')'

思路:

​ 對於最大有效括號長度,只靠一個棧是無法做到的,因此需要新增一個數組來記錄到達每個位置時的最大有效括號長度

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int>st;//記錄左括號出現的位置
        int dp[s.size()+1];//dp[i]表示以s[i-1]結尾的最長括號子串
        dp[0]=0;
        for(int i=0;i<s.size();i++){
            if(s[i]=='('){
                st.push(i);
                dp[i+1]=0;//'('不可能是合法括號結尾
            }else{
                //如果是')'
                if(!st.empty()){
                    int leftIndex=st.top();
                    st.pop();
                    int len=1+i-leftIndex+dp[leftIndex];
                    dp[i+1]=len;
                }else{
                    //沒有配對左括號
                    dp[i+1]=0;
                }
            }
        }
        int maxL=0;
        for(int i=0;i<s.size()+1;i++){
            maxL=max(maxL,dp[i]);
        }
        return maxL;
    }
};