美文网首页算法代码
最长的有效括号

最长的有效括号

作者: windUtterance | 来源:发表于2020-05-16 10:23 被阅读0次

题目描述
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度.

示例
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

Java代码

class Solution {
    1、First of All,栈底永远保存着当前有效子串的前一个字符的下标,就像个守门员一样守在那里,
       所以一开始要将-1放入栈中。
    2、遇到左括号就入栈;
    3、遇到右括号就将栈顶元素出栈。此时有两种情况:
   (1)如果栈顶元素出栈后,栈内剩下的元素不为空,则说明弹出的这个栈顶元素一定是左括号,
       因为栈底有保险。
   (2)如果栈顶元素出栈后,栈内为空,则说明刚刚弹出的这个栈顶元素就是之前的“有效子串前一位的字符下标”,
       守门员都没了,所以此时应该使用当前的右括号的下标入栈,更新这个“有效子串前一位的字符下标”。
    public int longestValidParentheses(String s) {
        if(s == null || s.length() == 0) return 0;
        int maxans = 0;
        Deque<Integer> dq = new ArrayDeque<>();
        dq.push(-1);

        for(int i = 0;i < s.length();i++) {
            if(s.charAt(i) == '(') {
                dq.push(i);
            } else {
                dq.pop();
                if(dq.isEmpty()) {
                    dq.push(i);
                } else {
                    maxans = Math.max(maxans, i - dq.peek());
                }
            }
        }
        return maxans;
    }
    //动态规划
    public int longestValidParentheses(String s) {
        if(s == null || s.length() == 0) return 0;
        int maxans = 0;
        
        int dp[] = new int[s.length()];
        for(int i = 1;i < s.length();i++) {
            if(s.charAt(i) == ')') {
                if(s.charAt(i - 1) == '(') {
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
                } 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;
                }
                maxans = Math.max(maxans, dp[i]);
            }
        }
        return maxans;
    }
}

相关文章

  • 最长有效括号

    题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/long...

  • 最长有效括号

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

  • 最长有效括号

    难点在于()()如何匹配前面的连续(),还有(())如何处理 举例:s[i-2]==")" ()([)]=>dp[...

  • 最长有效括号

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

  • LeetCode-32-最长有效括号

    LeetCode-32-最长有效括号 题目 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的...

  • LeeCode刷题笔记4:最长有效括号

    @[TOC](最长有效括号) 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串...

  • 最长的有效括号

    题目描述:给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例:输入: ")(...

  • 32. 最长有效括号

    32. 最长有效括号 视频讲解挺好的

  • leetcode 32 最长有效括号

    32. 最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1...

  • 栈--最长有效括号

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。例:输入: ")()())" ...

网友评论

    本文标题:最长的有效括号

    本文链接:https://www.haomeiwen.com/subject/qmqlohtx.html