题目描述
思路
注意:
这个题要找的是最长的有效括号的长度,指的是连续存在的最长子串。不是指里面的有效括号的个数。
做法
本题的方法有些特殊,我自己一开始也没有想到。本题很自然可以想到通过一个堆栈来控制实现。但是本题存入堆栈的不是字符(左右小括号)。本题通过维护一个记录各个括号位置的堆栈来实现,stack<int>,另外,通过一个变量start记录有效括号的起始位置。
(1)如果是左括号,那么就压入堆栈。右括号是不压入堆栈的。即,堆栈中只存在左括号对应的元素位置。
(2)如果是右括号,那么需要分情况处理:
- 如果此时堆栈不为空,那么说明得到了一对括号。此时,将堆栈中的括号出栈。出栈之后,如果堆栈为空了,那么可以得到最长有效括号的长度为
max(max_len, i-start)
.如果不为空,那么当前的最大长度为max(max_len, i-temp.top())
- 如果此时堆栈为空,那么当前遇到的右括号必然是非法的,重置起始位置
start = i
.
如需理解,自己以一两个例子推演一下即可确定。本题确实是不容易想到。
解答
class Solution {
public:
int longestValidParentheses(string s) {
int max_len=0;
int start=-1;
if(s.empty()) return 0;
stack<int> temp;
for(int i=0; i<s.size();++i)
{
if('(' == s[i]) temp.push(i);
else
{
if(!temp.empty())
{
temp.pop();
if(temp.empty()) max_len=max(max_len, i-start);
else max_len=max(max_len, i-temp.top());
}
else
{
start=i;
}
}
}
return max_len;
}
};