原题链接:32. 最长有效括号
solution:
利用栈进行匹配,遍历字符串s时,只有两种情况'('或')'
①当s[i]为'('的时候,将其对应的下标存入栈中
②当s[i]为')'的时候,将栈顶弹出,相当于有一组有效的括号,若弹出的时候栈为空代表这个位置是一个无效')'括号,标记sta[i]为true.
③当遍历玩字符串的时候,若栈不为空,将栈内存储的所有下标i,都标记为true,因为这些都是无效'('
求解答案的时候,只要遍历一遍标记数组,记录最长有效括号就可
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size();
stack<int> stk;
vector<bool> sta(n, false);
for(int i = 0;i < n;i++) {
if(s[i] == '(') stk.push(i);
else {
if(stk.empty()) sta[i] = true;
else stk.pop();
}
}
while(!stk.empty()) {
sta[stk.top()] = true;
stk.pop();
}
int ans = 0;
int len = 0;
for(int i = 0;i < n;i++) {
if(sta[i]) {
len = 0;
continue;
}
len++;
ans = max(ans,len);
}
return ans;
}
};