leetcode32. 最长有效括号

class Solution {
    //方法2:使用栈
    // public int longestValidParentheses(String s){
    //     //利用栈可以匹配括号是否有效的特性,用栈遍历一次字符串,
    //     //将所有无法进行匹配的括号都标记下来;最后统计未标记括号的最大长度即可
    //     int n = s.length();
    //     Deque<Integer> stack = new LinkedList<>();
    //     boolean[] flag = new boolean[n];
    //     for(int i = 0;i < n;i++){
    //         char c = s.charAt(i);
    //         if(c == '(')
    //             stack.push(i);
    //         else{
    //             //出现右括号,但无左括号可匹配,标记
    //             if(stack.isEmpty())
    //                 flag[i] = true;
    //             else
    //                 stack.pop();
    //         }
    //     }
    //     //多余的左括号也是无法匹配的,标记
    //     while(!stack.isEmpty()){
    //         flag[stack.pop()] = true;
    //     }

    //     //统计最长
    //     int count = 0,maxCount = 0;
    //     for(int i = 0;i < n;i++){
    //         if(flag[i]){
    //             maxCount = Math.max(maxCount,count);
    //             count = 0;
    //         }else
    //             count++;
    //     }
        
    //     return Math.max(maxCount,count);
    // }




    //方法1:从左向右以及从右向左都遍历一次
    // public int longestValidParentheses(String s) {
    //     //用一个数组记录到当前位置为止出现的左右括号;左括号+1,右括号-1
    //     //1.f[i] = f[i-1] + s(i) ;f[i-1]>=0时
    //     //2.f[i] = s(i);f[i-1]<0时
    //     //从左向右以及从右向左都遍历一遍,就可以得到答案。
    //     if(s.length() <= 0)
    //         return 0;
    //     int n = s.length();
    //     int[] f = new int[n];
    //     f[0] = getNum(s.charAt(0));
    //     for(int i = 1;i < n;i++){
    //         char c = s.charAt(i);
    //         if(f[i-1] >= 0)
    //             f[i] = f[i-1] + getNum(c);
    //         else
    //             f[i] = getNum(c);
    //     }
    //     int count = 0,maxCount = 0;
    //     for(int i = 0;i < n;i++){
    //         if(f[i] >= 0)
    //             count++;
    //         else
    //             count = 0;
    //         if(f[i] == 0)
    //             maxCount = Math.max(maxCount,count);
    //     }

    //     int[] f2 = new int[n];
    //     f2[n-1] = 0-getNum(s.charAt(n-1));
    //     for(int i = n-2;i >= 0;i--){
    //         char c = s.charAt(i);
    //         if(f2[i+1] >= 0)
    //             f2[i] = f2[i+1] - getNum(c);
    //         else
    //             f2[i] = 0-getNum(c);
    //     }
    //     int count2 = 0,maxCount2 = 0;
    //     for(int i = n-1;i >= 0;i--){
    //         if(f2[i] >= 0)
    //             count2++;
    //         else
    //             count2 = 0;

    //         if(f2[i] == 0)
    //             maxCount2 = Math.max(maxCount2,count2);
    //     }
    //     return Math.max(maxCount,maxCount2);
    // }
    // public int getNum(char c){
    //     if(c == '(')
    //         return 1;
    //     else
    //         return -1;
    // }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值