这道题目比较难,注意到多余的右括号起到了一个分段的作用,匹配的括号只可能在多余的右括号两侧,不可能跨过右括号。因此存在如下做法
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
int len = 0, maxlen = 0;
int n = s.size();
st.push(-1);
for(int i=0;i<n;i++){
if(s[i]=='('){
st.push(i);
}else{
st.pop();
if(st.empty()){
st.push(i);
}else{
maxlen = max(maxlen,i-st.top());
}
}
}
return maxlen;
}
};
这里还有一种两边遍历贪心的方式,分别记录左括号的个数和右括号的个数,当左括号个数等于右括号个数时,记录当前段的长度,当右括号个数大于左括号个数时,则清零,这种方法比较难想,除了正向遍历一次还需要倒叙遍历一次。