【32】最长有效括号

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

思路:

  1. 从左往右遍历
    定义三个计数器
    cnt : 统计当前未被抵消的’('的个数
    max:统计遍历到当前位置为止,出现的最长有效括号对的个数
    cur:统计当前已匹配上的有效括号对个数
    遍历字符数组,更新cnt的值,
    如果cnt>0,新增一个括号对,cur++;
    如果cnt=0,新增一个括号对,cnt++,这时候可以更新max的值:max=max>cur?max:cur;
    如果cnt<0,说明当前有效括号对统计结束,该进行下一次统计了,置零cnt和cur。

    return max*2
  2. 从右往左遍历
    定义三个计数器
    cnt : 统计当前未被抵消的 ')'的个数
    max:统计遍历到当前位置为止,出现的最长有效括号对的个数
    cur:统计当前已匹配上的有效括号对个数
    遍历字符数组,过程同上,不再赘述。
    return max*2
  3. 最长有效括号对就是两次遍历返回值中,结果较大的那一个。

代码如下:

public int longestValidParentheses(String s) {
        char[] chars = s.toCharArray();
        int left = oneside('(',chars,0,chars.length,1);
        int right = oneside(')',chars,chars.length-1,-1,-1);
        return left>right?left:right;

    }

    private int oneside(char c, char[] chars, int start, int end, int add) {
        int cnt = 0;
        int max = 0;
        int cur = 0;
        for(int i=start;i!=end;i+=add){
            if(chars[i]==c){
                cnt++;
            }else {
                cnt--;
                if(cnt>0){
                    // ( () 当前有个括号产生 但前面有多余的(
                    cur++;
                }else if(cnt==0){
                    // () () 当前有个括号产生,且前面没有多余的(
                    cur++;
                    max = max>cur?max:cur;  //如果不存在cnt=0的情况怎么办?比如 (()     --那就从右往左遍历匹配')'
                }else{
                    //到这个)为止,前面的最长有效括号统计完毕。。 各计数器需要清0,开始下一轮的计数
                    cnt = 0;
                    cur = 0;
                }
            }
        }
        return max*2;
    }

说明:由于是在cnt==0这种情况下更新max的值,如果在遍历字符串的过程中不存在cnt=0这种情况,比如((),那不就完蛋了?解决办法就是,从右往左再遍历一次,以’)'为模板,统计匹配的括号对,在上述案例中,从右往左,必定存在cnt=0。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值