[ 熱題 HOT 100]---32. 最長有效括號---棧//困難等級

1 題目描述

給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: “(()”
輸出: 2
解釋: 最長有效括號子串爲 “()”
示例 2:

輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串爲 “()()”

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

  • 方法一:暴力法
    java 運行不通過超時應該 複雜度太高

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

  • 方法二:棧
    1、首先,棧底永遠保存着當前有效子串的前一個字符的下標,就像個守門員一樣守在那裏,所以一開始要將-1放入棧中。
    2、遇到左括號就入棧;
    3、遇到右括號就將棧頂元素出棧。此時有兩種情況:
    (1)如果棧頂元素出棧後,棧內剩下的元素不爲空,則說明彈出的這個棧頂元素一定是左括號,講真,因爲棧底有保險。
    (2)如果棧頂元素出棧後,棧內爲空,則說明剛剛彈出的這個棧頂元素就是之前的“有效子串前一位的字符下標”,守門員都沒了,所以此時應該使用當前的右括號的下標入棧,更新這個“有效子串前一位的字符下標”。

在這裏插入圖片描述

3 解決代碼

  • 方法一:暴力法 《Java代碼》
//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;
    }
}

作者:LeetCode
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
  • 方法二:棧《Java代碼》
class Solution {
    public int longestValidParentheses(String s) {
        int max_len = 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{
                    //不爲空,更新最大的長度
                    max_len = Math.max(max_len, i - stack.peek());
                }
            }
        }
        return max_len;

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章