32. Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

Example 1:

Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"

Example 2:

Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"

遇到好几次和括号有关的题,一般都是用栈来解决。刚开始想到用栈存放上一个‘(’的下标,但是这样带来一个问题,就是遇到“()(())”这样的序列计算出来只有4,无法计算组合在一起的括号。

经过改进后,栈中存放的是未被正确配对的‘(’和‘)’的下标。

首先判断是否为‘(’,如果是则将下标存入栈中。如果是‘)’,则继续判断栈是否为空,若为空说明这个‘)’无法和任何‘(’匹配,也无法和后面的括号匹配,故将此下标压入栈中;如果栈不为空,且上一个未成功匹配的括号为‘(’,则此时可以计算新的匹配长度,此时仍需分情况讨论,如果栈弹出这个下标后就为空了,则说明前面的括号全部被正确匹配了,将res更新为i+1和res的最大值,如果栈中仍有未匹配的下标,则说明仍有未被匹配的括号,将res更新为i-m.top()和res的最大值。

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> m;
        int res=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='(')
                m.push(i);
            else
            {
                if(!m.empty()&&s[m.top()]=='(')
                {
                    m.pop();
                    if(!m.empty())
                        res=max(res,i-m.top());
                    else
                        res=max(res,i+1);
                }
                else
                    m.push(i);
            }
        } 
        return res;
    }
};



猜你喜欢

转载自blog.csdn.net/jifeng7288/article/details/79937690