力扣LeetCode #32 最长有效括号(LongestValidParentheses)

- 题目描述

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

来源:LeetCode

- 示例

  • 示例 1:
    输入: “(()”
    输出: 2
    解释: 最长有效括号子串为 “()”

  • 示例 2:
    输入: “)()())”
    输出: 4
    解释: 最长有效括号子串为 “()()”

- 思路分析

动态规划。定义: l v p [ i ] lvp[i] lvp[i] = 以 i i i结束的最长有效括号长度。如果 i i i位置是’(’,则不用管,继续看下一位;如果 i i i位置是’)’,则需要考虑匹配。因为知道 l v p [ i − 1 ] lvp[i-1] lvp[i1],所以可以找到应该和 i i i匹配的位置。如果该位置是左括号,则匹配成功。需要特殊处理的是独立括号的情况,比如字符串"()()(())"的前两个括号就是独立括号。

- JAVA实现

public int longestValidParentheses(String s) {
	int len = s.length();
        if(len==0) return 0;
        int max=0;
        int[] lvp = new int[len];
        for(int i=0;i<len;i++) lvp[i]=0;
        for(int j=1;j<len;j++) {
            if(s.charAt(j)==')') {
                int left = j-lvp[j-1]-1;  //找到应该匹配的位置
                if(left>=0) {
                    if(s.charAt(left)=='(') {
                        lvp[j]=lvp[j-1]+2;
                        if(left>0) lvp[j]+=lvp[left-1];  //前面有独立括号
                    }
                    if(lvp[j]>max) max=lvp[j];
                }
            }
        }
        return max;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值