前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态规划 32. 最长有效括号

动态规划 32. 最长有效括号

作者头像
MashiroT
发布2023-01-30 14:55:51
2200
发布2023-01-30 14:55:51
举报
文章被收录于专栏:MashiroのBlogMashiroのBlog

动态规划 32. 最长有效括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

代码语言:javascript
复制
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

代码语言:javascript
复制
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

代码语言:javascript
复制
输入:s = ""
输出:0

提示: 0 <= s.length <= 3 * 104 s[i]'('')'

代码

代码语言:javascript
复制
package ski.mashiro.leetcode;

import java.util.Deque;
import java.util.LinkedList;

public class _32 {
    /**
     * 32. 最长有效括号
     * <p>
     * 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
     */
    public static void main(String[] args) {
        System.out.println(longestValidParentheses2("(()())"));
    }
//	  dp
    public static int longestValidParentheses(String s) {
        int rs = 0;
//        建立表格,表示以下标 i 字符结尾的最长有效括号的长度
        int[] dp = new int[s.length()];
//        一个字符不可能成为括号对
        for (int i = 1; i < s.length(); i++) {
//            如果 i 处为 ')'
            if (s.charAt(i) == ')') {
//                如果 ')' 前一个是 '('
                if (s.charAt(i - 1) == '(') {
//                    判断是否有可能是 ()()() 这种情况
                    if (i < 2) {
//                    如果 i < 2 ,说明前面没有有效括号对
                        dp[i] = 2;
                    } else {
//                    是 ()()() 这种情况
//                    即 ---|   i = 3 和 5 时,前面有一对有效括号
//                       -|-|  这时就要加上前面的长度
                        dp[i] = dp[i - 2] + 2;
                    }
//                         判断是否不是 ())       连续两个 ')', dp[i - 1] 前一个 ')' 合法, -1 找到括号对的前一个
                } else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
//                    dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
//                    判断情况 (()..()) 这样末尾 i 为奇数, 中间括号对为偶数,且两者差为 1
                    if (i - dp[i - 1] < 2) {
                        dp[i] = dp[i - 1] + 2;
                    } else {
                        dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
                    }
                }
                rs = Math.max(rs, dp[i]);
            }
        }
        return rs;
    }

//	  栈
    public static int longestValidParentheses2(String s) {
//        栈顶元素为最后一个无法匹配的 ')' 的值
        Deque<Integer> stack = new LinkedList<>();
        int rs = 0;
//        边界条件
        stack.push(-1);
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            }
            if (s.charAt(i) == ')') {
//                先弹出   因为栈内必有一个元素 即栈顶
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    rs = Math.max(rs, i - stack.peek());
                }
            }
        }
        return rs;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动态规划 32. 最长有效括号
    • 代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档