LeetCode解题记录(32)——最长有效括号

LeetCode解题记录——最长有效括号

题目描述

给定一个只包含 '('')' 的字符串,找出最长的包含有效括号的子串的长度。

示例

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

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

题目理解

要求通过输入的括号串,找到其中最长的有效子串,即每个括号都有对应的匹配项。

这里要注意,是要找出连续的子串。

解题思路

对于括号匹配,最初想到的就是借助栈来完成匹配操作。

这里由于我们需要得到有效的子串长度,所以我们必须在栈中记录下每个括号的下标。当出现不满足条件的情况时,计从而算当前有效子串长度。

在这里我们需要在栈底加入一个-1用于做一个偏移(由于下标从0开始,长度需要加一),默认将其视为(

对于每个字符,我们都进行如下判断:

  • 如果字符为(,我们则压栈。
  • 如果为),我们将弹出一个匹配,这时会有两种情况
    • 如果栈为空,则说明当前字符前的所有字符串都已完全匹配成功,但是由于我们在一开始加入了一个偏移,而这个位置默认是为(的,所以我们可以知道,这个)实际上是无效的匹配项。我们直接将这个位置的下标值作为新的偏移值压入栈中。
    • 如果栈不为空,则说明栈顶与当前位置之间的子串正好为一个有效的子串,需要和当前最大长度进行对比,判断是否需要覆盖当前最大长度。

这里我们可以注意到,不能匹配到的(将永远在栈中,以偏移的形式存在。

对应代码如下:

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size()<2)
            return 0;
        int stack[s.size()+1];
        int top = 0;
        int maxlength = 0;
        //哨兵
        stack[top++] = -1;
        for(int i = 0;i<s.size();i++){
            if(s[i] == '('){
                stack[top++] = i;
            }else{
                top--;
                if(top == 0){
                    stack[top++] = i;
                }else{
                    maxlength = maxlength>i-stack[top-1]?maxlength:(i-stack[top-1]);
                }
            }
        }
        return maxlength;
    }
};

运行结果如下:
运行结果

我的所有解题代码都会上传到我的github上,需要可以自取。

LeetCode解题代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值