LeetCode0032.最长有效括号 Go语言AC笔记

时间复杂度:O(n),空间复杂度:O(1)

解题思路

如果看过我“22.括号生成”题解的朋友,应该会很容易理解这一题的思路。

LeetCode0022.括号生成 Go语言AC笔记https://blog.csdn.net/Hexa_H/article/details/127058909用left和right记录匹配子串的左右括号数,每当遇到左括号时就令left加1,遇到右括号时right加1但接下来需要做一下判断:如果left刚好等于right,就说明有括号匹配上了,匹配子串长度加2;但如果right大于left了,说明该右括号是多余的无法匹配,就令left和right置0重新计算长度。

细心的朋友会发现,按照上述方法有一种情况会出现错误,那就是left>right即有多余的左括号,所以按照上述方法我们只能做对右括号多余的例子。不过我们可以调整下思维,从右向左遍历把右括号当作左括号不就可以做对左括号多余的例子了嘛。

所以正常情况下该题需要从左向右和从右向左分别遍历一次,但是其实可以将两次不同方向的遍历合为一次遍历,在从左向右遍历时同时遍历镜像方向不就好了嘛。

AC代码

func longestValidParentheses(s string) (res int) {
    //1是从左向右遍历,2是从右向左遍历
    leftCount1,rightCount1,leftCount2,rightCount2,n:=0,0,0,0,len(s)
    //一次遍历求出结果
    for i:=0;i<n;i++{
        if s[i]=='('{
            leftCount1++
        }else{
            rightCount1++
            if leftCount1==rightCount1{
                res=max(res,leftCount1+rightCount1)
            }else if rightCount1>leftCount1{
                leftCount1,rightCount1=0,0
            }
        }
        if s[n-1-i]==')'{
            rightCount2++
        }else{
            leftCount2++
            if leftCount2==rightCount2{
                res=max(res,leftCount2+rightCount2)
            }else if leftCount2>rightCount2{
                leftCount2,rightCount2=0,0
            }
        }
    }
    return res
}
func max(a,b int) int {
    if a>b{
        return a
    }
    return b
}

感悟

受之前做题的影响,其实绝大多数两次相反方向的遍历都可以用一次遍历解决,这样可以更快速的解题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值