Featured image of post 32.Longest Valid Parentheses

32.Longest Valid Parentheses

最长闭合括号

目录

最长有效括号

  给定一个仅包含字符 ‘(’ 和 ‘)’ 的字符串,返回最长有效(格式正确)括号的长度子串。 例1:

输入: s = "(()"
输出: 2
解析:最长的有效括号子串是 "()"。

例2:

输入: s = ")()())"
输出: 4
解析:最长的有效括号子串是 "()()"。

例3:

输入: s = ""
输出: 0

约束条件:

  • $0 <= s.length <= 3 * 10^4$
  • s[i]是’(’,或者’)’
$$$$

此题虽然被leetcode标注为难等级,但是其实和最长回文应该属于差不多等级难度。这里贴出我的解法,该解法目前在leetcode打榜中占据了优势位置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <string.h>

// @lc code=start
int longestValidParentheses(char *s)
{

    unsigned short length = strlen(s);
    // 动态规划 is too much memory cost

    // cutoff left right bound
    while (length > 0 && s[0] != '(')
    {
        s++;
        length--;
    }
    while (length > 0 && s[length - 1] != ')')
    {
        length--;
    }

    s[length] = 0;

    if (length <= 2)
        return length == 2 ? 2 : 0;

    int ret = 0;
    unsigned short lnum = 1, rnum = 0, delta = 0;
    for (int i = 1; i < length; i++)
    {
        if (s[i] == '(')
            lnum += 1;
        else
            rnum += 1;
        if (rnum > lnum)
        {
            if (lnum << 1 > ret)
                ret = lnum << 1;

            lnum = 0;
            rnum = 0;
            delta = i + 1;
        }
    }

    if (lnum == rnum)
        return rnum << 1 < ret ? ret : rnum << 1;
    if (rnum << 1 <= ret)
        return ret;

    s = s + delta;
    length -= delta;
    lnum = 0, rnum = 1;
    for (int i = length - 2; i >= 0; i--)
    {
        if (s[i] == ')')
            rnum += 1;
        else
            lnum += 1;
        if (lnum > rnum)
        {
            if (rnum << 1 > ret)
                ret = rnum << 1;
            lnum = 0;
            rnum = 0;
        }
    }

    return lnum << 1 < ret ? ret : lnum << 1;
}
C

提交截图(提交时,非现在状态)


完整信息点击此连接查看