20210511力扣第32题:最长有效括号(四种方法解)

题目

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

输入:s = ""
输出:0

提示:
0 <= s.length <= 3 * 104
s[i]'('')'

题目理解:

这里说的是最长有效子串,返回长度,看一个例子:

() ) ()()()

中间应该没有空格,我加上了,仔细看,这个应该返回的是6,因为需要连续,所以前两个就被舍弃了。

()(()) 

这样的类型也是有效的,所以返回也是6.


1.想法:

自己想到之前的有效括号了,按照那个思想,先建立一个栈,在栈中遇到“(”就把“)”压入栈中,但是在遇到“)”或者出栈时候为空的情况没有考虑清楚,感觉这样一道不算难的题变得不好做了,看了评论才知道,原来是找连续的括号长度,让我对题目有了更深的理解。


这道题自己没有做出来,但是看到评论中说遇到过这样的面试题,15分钟,所以准备好好看一下怎么解答,就看一下官方的视频。

2.解法

2.1 方法1

暴力破解:
在这里插入图片描述
括号是成对出现的,那么如图长度是7, 我们就应该从小于长度的最大偶数即6开始遍历。找到其中是否有最长有效,没有就长度为4进行遍历,找到有效的后就可以返回,这样就是最长的了。
在这里插入图片描述
大概的思路:先写一个判断是否有效isvalid()的方法,其中遇到左括号 就入栈,遇到右括号判断栈顶元素是否是左括号,是的话就弹出,其余情况就返回false。
写完后,就进行小于或等于长度的偶数遍历,就比较当前值和下一个值的括号是否有效。
接下来尝试一下代码的编写吧:

class Solution {
   
    public int longestValidParentheses(String s) {
   
       //判断是否为偶数
       int len = s.length();
       if(len<2) return 0;
        
         int maxlen= 0;
        for(int i = 0;i<len;i++)
        {
   
            for(int j = i+2;j<len+1;j+=2)
            {
   
                if(isValid(s.substring(i,j)))
                {
   
                    maxlen=Math.max(maxlen,j-i);
                }

            }
        }
        return maxlen ;

    }

    public boolean isValid(String s)
    {
   
        Stack<Character> stack = new Stack<>();
        for(char ch:s.toCharArray())
        {
   
            if(ch=='(')
            {
   
                stack.push('(');
            }
            else if(!stack.isEmpty() &&stack.peek
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值