leetcode Longest Valid Parentheses O(n)解法

模拟栈的工作进栈和出站的过程,一对括号如果能匹配,意味着左括号的下标到右括号的下标的这段括号都能匹配,所以只需要模拟一遍就够了!!!用个数组记录那些可以匹配的区间,然后线性扫一遍就可以得到最长的区间了。

每个元素最多进栈一次,出栈一次,线性扫描只需要一遍,所以时间复杂度为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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值