后来在LeetCode上看到有人非常漂亮的解法。
大概思路是把所有左括号的下标压栈,然后扫描,同时要记录最后一个无效右括号的下标last。
每遇到右括号,如果栈为空,则说明无效,更新last;
如果不为空,则弹出栈顶下标,此时若栈为空,则有效长度为i - last;
若弹出后栈不为空,则有效长度为i - 栈顶元素。
非常酷的方法。
class Solution {
public:
int longestValidParentheses(string s) {
int last = -1;
list<int> lst;
int res = 0;
for(int i=0;i<s.length();++i){
if(s[i]==')'){
if(lst.empty())
last = i;
else{
lst.pop_back();
if(lst.empty())
res = max(res,i-last);
else
res = max(res,i-lst.back());
}
}
else
lst.push_back(i);
}
return res;
}
};