题目描述
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
解题思路
一、记忆化搜索
建立一个数组 dp[s.length],其中 dp[i]表示以 s[i]结尾的有效括号子串的长度(包含合法嵌套括号,但是不包括连续的括号,参考下面示例),我们从头开始遍历字符串每个字符,如果当前字符是 ‘)’ 则从当前位置前一个位置开始寻找没有被匹配过的 ‘(’ ,得到 dp 数组后,遍历求出连续有效括号子串的最大长度。 比如字符串 “()(()()))”,其对应的 dp 数组如下:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s | ( | ) | ( | ( | ) | ( | ) | ) | ) |
dp | 0 | 2 | 0 | 0 | 2 | 0 | 2 | 6 | 0 |
public int longestValidParentheses(String s) {
int[] dp = new int[s.length()];
int res = 0;
for (int i = 0; i < dp.length; i++) {
if (s.charAt(i) != ')') {
continue;
}
int j =