题目
代码:
class Solution {
public:
stack<int> stk;
int longestValidParentheses(string s) {
if(s.size()==0)return 0;
int Max = 0;
for(int i=0;i<s.size();i++){
switch(s[i]){
case '(':
{
stk.push(i);
break;
}
case ')':
{
if(!stk.empty() && s[stk.top()] == '('){
stk.pop();
}else{
stk.push(i);
}
break;
}
}
}
if(stk.empty())return s.size();
int last = s.size();
while(!stk.empty()){
int tmp = stk.top();
stk.pop();
Max = max(last-tmp-1,Max);
last = tmp;
if(stk.empty()){
Max = max(Max,tmp);
}
}
return Max;
}
};
思路:
这里的栈有些特殊:存储的是括号的下标。
接下来就是简单的入栈出栈操作:
- 如果是‘(’则简单的入栈;
- 如果是‘)’则需要判断一下:
1> 如果栈顶为‘(’,则进行配对,栈顶出栈。
2> 如果栈顶不是‘(’,则将‘)’入栈。
遍历完毕一次字符串后,也就是字符串中连续的匹配括号都不在栈中了,在栈里面保存的都是无法匹配的括号。
这些无法匹配的括号,都是他们对应的下标,这时就会发现,这些下标把原本的字符串分成了几个区间(这些区间就是连续的匹配括号的区间)。
只需要求这些区间的最大值即可。