求最长的有效括号长度

238 阅读1分钟

输入一串括号,例如:‘()()((()))))’,求最长的有效括号的长度是多少?

  • 思路:
  • 1.动态规划.
  • 2.当前如果是有括号 ‘)’ 所在的位置是否有效,跟前面的是否有左括号匹配有关系.
  • 3.下标为0的位置是开始位置,无论左括号还是右括号,默认dp[0] = 0.
  • 4.如果当前是右括号,就要寻找与他匹配的左括号.
  • 5.如果找到了与之匹配的左括号,那么长度最起码是2
  • 6.当前右括号和找到的匹配的左括号之间可能还有有效的括号dp[i- 1],累加起来
  • 7.然后再加上找到的左括号前面紧邻近的有效的括号,累加起来,才能算最长的有效括号
package com.suanfa.lxm;
public class Code_1_validParenthesis {
    public static void main(String[] args) {
	String s = "()()((()))))";
	System.out.println(maxLength(s));	
    }
    // 有效的括号长度
public static int maxLength(String s) {
    if(s == null || s.equals("")) {
	return 0;
    }
    char[] str = s.toCharArray();
//System.out.println(str[0]);
    int[] dp = new int[str.length];
    int pre = 0;
    int ans = 0;
    // dp[0] = 0 // 默认是0  可以不写 所以循环从1开始
    for (int i = 1; i < str.length; i++) {
        if(str[i] == ')') {
            pre = i - 1 - dp[i - 1];// 与str[i]配对的左括号的位置 pre
            if(pre >= 0 && str[pre] == '(') {
                dp[i] = 2+ dp[i - 1]+(pre > 0 ? dp[pre - 1] : 0);
                // 找到与之匹配的左括号,长度至少为2,
                // dp[i-1]是两个括号之间的有效括号
                // dp[pre - 1]找到的匹配的左括号前面的有效括号长度
                // 三个累加起来就是最长括号了
            }
            ans = Math.max(ans, dp[i]);
        }
    }
    return ans;
   }
}