LeetCode第32题( Longest Valid Parentheses)

题目

Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.

Example 1:

Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”
Example 2:

Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”

解法

动态规划类的题目首先写出来状态方程,但是一般很难第一时间写出来对的,我的建议是先不用写总的,根据分情况讨论所有情况,最后合并一些情况。
以 ()(()和()(())两种情况为例。
case1为2,case2为6,case2只是多了一个),由此可知当s[i] = )合并以前的情况.
F(i)代表以char a = s[i]是否是有效的字符串里的一个字符,是的话F(i)等于s中最长的有效长度,不是的话为0;
讨论:
s[i] = (时,F(i) = 0;
s[i] = )时,当s[i-1] = (时,F(i) = F(i-2) +2;
当s[i-1] = )时,且s[i-F(i-1)-1]==(,F(i) = F(i-1) + F(i-F(i-1)-2) +2;//合并情况
其他 情况 F(i) = 0;

合并一下case:

  1. s[i] == ) -> F(i)=F(i-1)+F(i-F(i-1)-2)+2;
    2.其他情况 -> F(i) = 0;

代码

 int longestValidParentheses(string s) {
        int len = s.size(),max = 0;
        vector<int> longest(len,0);
        for(int i = 1;i<len;i++){
            if(s[i]==')' && i-longest[i-1]-1>=0 && s[i-longest[i-1]-1]=='('){
                longest[i] = longest[i-1] + (i-longest[i-1] -2>0?longest[i-longest[i-1] -2]:0) + 2;
                max = max>longest[i]?max:longest[i];
            }
        }
        return max;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值