[ 热题 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;

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