leetcode32. 最长有效括号
给定一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
动态规划
dp[i]表示以第i个字符开头的括号,拥有的字符串长度,根据当前是左括号还是右括号,有不同的操作。注释在代码里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| class Solution { public int longestValidParentheses(String s) { if (s.length() == 0) return 0; int[] dp = new int[s.length()]; int max = 0; dp[s.length() - 1] = 0; for (int i = s.length() - 2; i >= 0; i--) { if (s.charAt(i) == ')') { if (s.charAt(i + 1) == '(') { dp[i] = dp[i + 1]; } else { dp[i] = 0; } } else { if (s.charAt(i + 1) == ')') { dp[i] = 2 + dp[i + 1]; } else { if (dp[i + 1] == 0) { dp[i] = 0; } else { int r = i + dp[i + 1] + 1; if (r < s.length() && s.charAt(r) == ')') { dp[i] = 2 + dp[i + 1] + dp[r]; } else { dp[i] = 0; } } } } max = Math.max(max,dp[i]); } return max; } public void show(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } }
|
leetcode 116