Hot10032. 最长有效括号

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hot10032. 最长有效括号相关的知识,希望对你有一定的参考价值。

32. 最长有效括号

参考:https://leetcode.cn/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/
参考:leetcode hot 100-32. 最长有效括号

  • 动态规划
class Solution 
    public int longestValidParentheses(String s) 
        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;
    

class Solution 
    public int longestValidParentheses(String s) 
        int maxans = 0;
        Deque<Integer> stack = new LinkedList<Integer>();
        stack.push(-1);
        for (int i = 0; i < s.length(); i++) 
            if (s.charAt(i) == '(') 
                stack.push(i);
             else 
                stack.pop();
                if (stack.isEmpty()) 
                    stack.push(i);
                 else 
                    maxans = Math.max(maxans, i - stack.peek());
                
            
        
        return maxans;
    


  • 不需要额外的空间
class Solution 
    public int longestValidParentheses(String s) 
        int left = 0, right = 0, maxlength = 0;
        for (int i = 0; i < s.length(); i++) 
            if (s.charAt(i) == '(') 
                left++;
             else 
                right++;
            
            if (left == right) 
                maxlength = Math.max(maxlength, 2 * right);
             else if (right > left) 
                left = right = 0;
            
        
        left = right = 0;
        for (int i = s.length() - 1; i >= 0; i--) 
            if (s.charAt(i) == '(') 
                left++;
             else 
                right++;
            
            if (left == right) 
                maxlength = Math.max(maxlength, 2 * left);
             else if (left > right) 
                left = right = 0;
            
        
        return maxlength;
    

以上是关于Hot10032. 最长有效括号的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Hot 100 --- 最长有效括号(java详细注解)

Hot10020. 有效的括号

刷题篇--热题HOT 10-20

Leetcode(32)-最长有效括号

LeetCode - 最长有效括号

32. 最长有效括号