longestValidParentheses-最长有效括号。

题意:

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

示例 1:

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

示例 2:

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

Related Topics 字符串 动态规划

解题思路

1.设置一个数组,里面存放字符串中每个字符对应位置()的最大值
2.判断字符串当前位置的最大值,主要看两种情况
2.1一种以()结尾的
这种情况看当前位置的前两个位置,字符的状态。累加2即可
2.2 一种以))结尾的,但是可以构成(((())))这种字符串
这种情况要累加倒数第二个)的状态,和符合(((())))字符串之前()的转态,在2.1基础上累加即可。

代码:

class Solution {
    public int longestValidParentheses(String s) {
           int res=0;

           //用来记录字符串中每个字符对应位置()的最大值
           int[] dp=new int[s.length()];
        for (int i = 1; i < s.length(); i++) {
            if(s.charAt(i)==')')
            {
                //步骤2.1()结尾的
                if(s.charAt(i-1)=='(')
                    dp[i]=  (i>=2 ? dp[i-2] : 0) +2;
                //以))结尾的,需要找到对应的(,以及判断之前是否有)并判断状态数值大小
                else if(i-dp[i-1]-1>=0&&s.charAt(i-dp[i-1]-1)=='(')
                    dp[i]=dp[i-1]+( i-dp[i-1]-2>=0 ? dp[i-dp[i-1]-2] : 0)+2;
                res=Math.max(res,dp[i]);
            }
        }
        return res;
    }
}

效果

info
解答成功:
执行耗时:2 ms,击败了74.72% 的Java用户
内存消耗:38.3 MB,击败了83.68% 的Java用户

猜你喜欢

转载自blog.csdn.net/tangshuai96/article/details/111401613