题目
Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
, which has length = 2.
Another example is ")()())"
, where the longest valid parentheses substring is "()()"
, which has length = 4.
寻找一个只有'('和')'的字符串中有效的匹配括号对的最长长度,用一个栈记录未匹配的'('或')'的下标,当字符串中出现一个能匹配的括号对时,弹出栈顶下标,此时的栈顶下标是最后一个未匹配的字符下标,用i-st.top()算出此时连续匹配的最长长度,并跟maxL比较得到最长的长度。
例如,对")()())",当第一个括号对匹配时,st.top()=0,i=2,此时maxL=2,当第二个括号对匹配时,st.top()=0,i=4,此时maxL=4;对"(()(()",当第一个括号对匹配时,st.top()=0,i=2,此时maxL=2,当第二个括号对匹配时,st.top()=3,i=5,此时maxL=2。可以看出,由于连续匹配的括号对下标弹栈,所以i-st.top()可以得到当前所在的匹配括号长度,如果中途该匹配串中断了,则再次计算时,st.top()记录的是新的匹配括号串前一个元素的下标,仍可作为长度来计算,并实时更新maxL值。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;//用栈记录下字符串中未匹配成对的'('和')'出现的位置
st.push(-1);
int size=s.size();
int maxL=0;//记录最长的匹配串长度
for(int i=0;i<size;++i){
int t=st.top();
if(t!=-1&&s[t]=='('&&s[i]==')'){//如果当前字符与栈顶字符匹配成一对,则将栈顶元素弹出,并计算此时已匹配的最长长度
st.pop();
maxL=max(maxL,i-st.top());
}
else
st.push(i);//否则将当前字符的下标压入栈
}
return maxL;
}
};