leetCode_Longest Valid Parentheses

题意:给定一段由“(”和“)”组成的序列,给出最长括号匹配序列的长度。

解答:动态规划+分类讨论,用ans[i]表示以i开始的最长括号匹配序列的长度。分以下几种情况。

情况1:如果s[i]==‘)’,显然是0,不用讨论。

情况2:如果s[i]=='(',分如下几种情况:

       如果s[i+1]==')',则ans[i]=2;

       如果s[i+1]=='('并且s[i+1+ans[i+1]]==')',则ans[i]=ans[i+1]+2。

要注意的是,上述情况只讨论了一段括号的情况,没讨论两段括号的情况。即讨论了(())的情况,没考虑()()的情况

所以,如果s[i+ans[i]]=='(',则有两段括号,所以ans[i]=ans[i]+ans[i+ans[i]]。

讨论完之后选取ans[i]中的最大值即可。我觉得这个是我写的最清楚的一篇日志。呵呵。

代码如下(好像代码很短的样子,哈哈,就是很短):

class Solution {
public:
    int longestValidParentheses(string s) {
        int i,j,ls=s.length(),res=0;
        vector<int> ans;
        for(i=0;i<ls;i++) ans.push_back(0);
        for(i=ls-1;i>=0;i--)
        {
            if(s[i]=='(')
            {
                if(i==ls-1) continue;
                else if(s[i+1]=='('&&s[i+1+ans[i+1]]==')') ans[i]=ans[i+1]+2;
                else if(s[i+1]==')') ans[i]=2;
                if(s[i+ans[i]]=='(') ans[i]=ans[i]+ans[i+ans[i]];
            }
        }
        for(i=0;i<ls;i++) res=max(res,ans[i]);
        return res;
    }
};



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值