LeetCode0032最長有效括號

題目描述

在這裏插入圖片描述

方法 1:暴力

算法

在這種方法中,我們考慮給定字符串中每種可能的非空偶數長度子字符串,檢查它是否是一個有效括號字符串序列。爲了檢查有效性,我們使用棧的方法。

每當我們遇到一個‘(’ ,我們把它放在棧頂。對於遇到的每個 ‘)’ ,我們從棧中彈出一個‘(’ ,如果棧頂沒有 ‘(’,或者遍歷完整個子字符串後棧中仍然有元素,那麼該子字符串是無效的。這種方法中,我們對每個偶數長度的子字符串都進行判斷,並保存目前爲止找到的最長的有效子字符串的長度。

例子:
“((())”
(( --> 無效
(( --> 無效
() --> 有效,長度爲 2
)) --> 無效
((()–> 無效
(())–> 有效,長度爲 4
最長長度爲 4

Java代碼

public class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push('(');
            } else if (!stack.empty() && stack.peek() == '(') {
                stack.pop();
            } else {
                return false;
            }
        }
        return stack.empty();
    }
    public int longestValidParentheses(String s) {
        int maxlen = 0;
        for (int i = 0; i < s.length(); i++) {
            for (int j = i + 2; j <= s.length(); j+=2) {
                if (isValid(s.substring(i, j))) {
                    maxlen = Math.max(maxlen, j - i);
                }
            }
        }
        return maxlen;
    }
}

複雜度分析

  • 時間複雜度: O(n^2)從長度爲 nn 的字符串產生所有可能的子字符串需要的時間複雜度爲 O(n^2)驗證一個長度爲 n 的子字符串需要的時間爲 O(n)O(n) 。
  • 空間複雜度: O(n)。子字符串的長度最多會需要一個深度爲 nn 的棧。

在這裏插入圖片描述
在這裏插入圖片描述

Java代碼

public 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;
    }
}

複雜度分析

  • 時間複雜度: O(n) 。遍歷整個字符串一次,就可以將 dp 數組求出來。
  • 空間複雜度: O(n)。需要一個大小爲 n的 dp 數組。

在這裏插入圖片描述

Java代碼

public class Solution {

    public int longestValidParentheses(String s) {
        int maxans = 0;
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                stack.pop();
                if (stack.empty()) {
                    stack.push(i);
                } else {
                    maxans = Math.max(maxans, i - stack.peek());
                }
            }
        }
        return maxans;
    }
}

複雜度分析

  • 時間複雜度: O(n) 。 nn 是給定字符串的長度。

  • 空間複雜度: O(n) 。棧的大小最大達到 n。

在這裏插入圖片描述

Java代碼

public 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;
    }
}

在這裏插入圖片描述

發佈了274 篇原創文章 · 獲贊 412 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章