模拟栈的工作进栈和出站的过程,一对括号如果能匹配,意味着左括号的下标到右括号的下标的这段括号都能匹配,所以只需要模拟一遍就够了!!!用个数组记录那些可以匹配的区间,然后线性扫一遍就可以得到最长的区间了。
每个元素最多进栈一次,出栈一次,线性扫描只需要一遍,所以时间复杂度为O(n),空间复杂度也是O(n)
class Solution {
public:
int longestValidParentheses(string s) {
const int n = s.size();
if(n==0)return 0;
/// int count = 0;
int ans = 0;
vector<int> a(n);
for(int i = 0;i<n;i++)a[i] = 0;
stack<int> s1;
for(int i = 0;i<n;i++){
if(s[i]=='('){
s1.push(i);
}else {
if(!s1.empty()){
a[i] = a[s1.top()] = 1;
s1.pop();
}
}
}
int count = 0;
for(int i = 0;i<n;i++)if(a[i]==1){
count++;
ans = max(ans,count);
}else {
count = 0;
}
return ans;
}
};