动态规划:leetcode 32 最长有效括号
## 题目
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
案例:
输入: ")()())" 输出:4
输入: "()(())" 输出:6
public int longestValidParentheses(String s) { //储存最大长度,返回 int max = 0; //状态数组,数组元素存储当前往前的括号有效的长度 int[] dp = new int[s.length()]; //循环,从第二个元素开始往前搜索解答,把结果储存在状态矩阵中 for (int i = 1; i < s.length(); i++) { //当当前的符号是 ')' ,这时候的括号往前是有效的,如果是'(',那么这时对应状态数组中存储为0,为无效括号 if (s.charAt(i) == ')') { //如果前一个符号为'(',那么当前的括号是有效的,最长有效括号长度为其前一个加2 if (s.charAt(i - 1) == '(') { dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;// 如果i>=2 那这时的dp应该为: dp[i] = dp[i-2] + 2 //如果前一个为')',则需要分情况, } else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {// 当 (()()) 这种情况出现 )()()) if (i - dp[i - 1] - 2 >= 0) { dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]; } else { dp[i] = dp[i - 1] + 2; } } max = Math.max(max, dp[i]); } } return max; }
测试案例
public static void main(String[] args) { L32 l32 = new L32(); String str = ")()())"; //测试案例 输出 4 String str2 = "()(())"; //测试案例 输出 6 int ret = l32.longestValidParentheses(str2); System.out.println(ret); }