• Longest Valid Parentheses


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

    For "(()", the longest valid parentheses substring is "()", which has length = 2.

    Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

    该题使用动态规划思想

    我首先想到的是利用一个二维数组来保存长度,二维数组的x,y为字符串下标,保存它们之间的子字符串的长度。

    但是我无法找到一种简单的公式来表示大问题和小问题之间的关系,这种关系相当复杂,我找出了36种情况,并想一一列出,但发现36种之外还有其他情况。结果我就放弃了这种方法。

    于是我到网上搜索了其他人的算法,发现居然只用一维数组就可以解决

    这个一维数组的值含义是表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度

    说实话,这个含义并不容易想得到,如果我来思考的话,我首先想到不包含s[i]的最长有效匹配括号字串。是基于什么样的思路才得到这样的结果。为什么我就想不出来呢?我不相信是我的智商问题,一定是我做的题太少了。继续刷题吧,量变总会有质变的那一天。

    int longestValidParentheses(string s) {
        int len = s.size();
        if(len < 2)
            return 0;
        int maxLen = 0;
        int f[len];
        for(int i = 0; i < len; ++i) // 初始化为0
            f[i] = 0;
    
        for(int i = len-2; i >= 0; --i)
        {
            if(s[i] == '(') // 既然是包含s[i],那么s[i]必然是'('才能构成匹配括号
            {
                int j = i + 1 + f[i+1]; // 下一个"也许"不能匹配的括号的位置
                if(j < len && s[j] == ')') // 这个"也许"经检查可以匹配
                {
                    f[i] = f[i+1] + 2;
                    if(j + 1 < len) // 当心如果后面还有匹配的括号的话长度要加上
                        f[i] += f[j+1];
                }
                if(f[i] > maxLen) // 最大长度
                    maxLen = f[i];
            }        
        }
        return maxLen;
    }
  • 相关阅读:
    如何找回Oracle所有用户丢失的密码
    数据库范式详解
    lua
    cdn
    初心
    广州
    vim 命令
    git 命令
    Linux琐碎
    汪国真语录
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/4704012.html
Copyright © 2020-2023  润新知