题目描述
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
方法一:动态规划
- 时间复杂度:O(n)
- 空间复杂度:O(n)
dp[i]代表当前从i开始,自右向左能匹配到的最长有效括号。
所以当s[i]为左括号时,dp[i]一定为0。当s[i]为右括号时,dp[i]应该找到与它相匹配的左括号,即判断 s[i-dp[i-1]-1] 是否为左括号。
若 s[i-dp[i-1]-1] 是左括号,则 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2] ,2代表dp[i]和它对应的左括号,dp[i-1]代表dp[i]和对应左括号中间的有效括号长度,dp[i-dp[i-1]-2]代表左括号前的有效括号长度。
var longestValidParentheses = function(s) {
var dp = new Array(s.length+1).fill(0);
var maxLen = 0;
for(let i=1; i<=s.length; i++){
if(s[i-1]