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; } };