解法思路:
对于这种括号匹配问题,一般都是使用栈
我们先找到所有可以匹配的索引号,然后找出最长连续数列!
例如:s = )(()()),我们用栈可以找到,
位置 2 和位置 3 匹配,
位置 4 和位置 5 匹配,
位置 1 和位置 6 匹配,
这个数组为:2,3,4,5,1,6 这是通过栈找到的,我们按递增排序!1,2,3,4,5,6
找出该数组的最长连续数列的长度就是最长有效括号长度!
所以时间复杂度来自排序:O(nlogn)。
接下来我们思考,是否可以省略排序的过程,在弹栈时候进行操作呢?
直接看代码理解!所以时间复杂度为:O(n)。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
vector<int> res;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '(')
{
st.push(i);
}
else
{
if(!st.empty())
{
res.push_back(st.top());
res.push_back(i);
st.pop();
}
}
}
int aa = 0;
if(res.size() == 0)
{
return 0;
}
sort(res.begin(), res.end());
int pre = res[0];
int bb = 0;
for(int i = 1; i < res.size(); i++)
{
if(res[i] - pre == 1)
{
aa++;
}
else
{
bb = max(bb, aa + 1);
aa = 0;
}
pre = res[i];
}
bb = max(bb, aa + 1);
return bb;
}
};