1.需有一个变量start记录有效括号子串的起始下标,max表示最长有效括号子串长度,初始值均为0
2.遍历给字符串中的所有字符
2.1若当前字符s[index]为左括号'(',将当前字符下标index入栈(下标稍后有其他用处),处理下一字符
2.2若当前字符s[index]为右括号')',判断当前栈是否为空
2.2.1若栈为空,则start = index + 1,处理下一字符(当前字符右括号下标不入栈)
2.2.2若栈不为空,则出栈(由于仅左括号入栈,则出栈元素对应的字符一定为左括号,可与当前字符右括号配对),判断栈是否为空
2.2.2.1若栈为空,则max = max(max, index-start+1)
2.2.2.2若栈不为空,则max = max(max, index-栈顶元素值)
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> cursor;
int start=0,maxLen=0;
for(int i=0;i<s.size();i++){
if(s[i]=='('){
cursor.push(i);
}else{
if(cursor.empty()){
start=i+1;
}else{
cursor.pop();
if(cursor.empty()){
//说明一组完成
maxLen=max(maxLen,i-start+1);
}else{
//说明是其中一部分
maxLen=max(maxLen,i-cursor.top());
}
}
}
}
return maxLen;
}
};