最长有效括号

最长有效括号32. 最长有效括号
题目描述:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

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

来源:力扣(LeetCode)

解法1:动态规划
一开始想到了动态规划,但是没有想到嵌套形式的括号应当怎么处理,看了题解觉得大佬的解法十分巧妙。
定义dp[i] 表示以下标 i 字符结尾的最长有效括号的长度。由于有效的字串必然以 ‘)’ 结尾,则’(‘的dp值一定为0。
那么一共有2种可能。(来自力扣官方题解截图)
在这里插入图片描述
第二种就处理了嵌套有效字符串的形式,如果当前位置减去前一个字符的最长有效字符串串长度之前的字符不为’(’,则该位置的’)'无法和前面的字符构成有效的括号,这一点比较难想到。

解法2:栈 栈思路和算法
开始栈加入-1,先弹出再计算最长有效长度的想法,十分巧妙,希望自己以后做题也能想到。
解法3: 贪心思路和算法的思路和之前做过的一个括号的题目很像,当左边括号的数目和右边括号的数目相等时说明有符合的字符串,通过左右两次循环避免了漏掉(() 这种从左向右遍历时左括号一直多于右括号的情况,并通过左向右遍历时right > left的判断保证了括号先左后右的有序性,反过来遍历也是一样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值