[LeetCode 32] 最长有效括号


给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。


没睡醒的脑回路:转换成 +1,-1 序列,利用两个充要条件(子段和为 0,子段任意前缀的和非负),在前缀和序列上用二分找满足条件的最远点

class Solution {
public:
    int longestValidParentheses(string s) {
        // 对前缀和序列 a,假设 s[i]='('
        // 令 j 为 i 右侧 a[i]-2 首次出现位置(不存在则为 n)
        // 则任意 i a(n);
        a[0]=s[0]=='('?1:-1;
        for(int i=1;i> o(n+n+2,vector(1,-1));
        for(int i=0;i

注意到删除任意前缀后,无法匹配的括号仍然无法匹配。用栈模拟并标记所有可以匹配的括号后,求最长连续全 1 段即可

相关