给你一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

    示例 1:

    输入:s = “(()”
    输出:2
    解释:最长有效括号子串是 “()”
    示例 2:

    输入:s = “)()())”
    输出:4
    解释:最长有效括号子串是 “()()”
    示例 3:

    输入:s = “”
    输出:0

    提示:

    0 <= s.length <= 3 * 104
    s[i] 为 ‘(‘ 或 ‘)’


    1. class Solution {
    2. /**
    3. f[i]表示以i下标为结尾的最大长度
    4. s[i] = '(' f[i] = 0
    5. s[i] = ')' {
    6. s[i-1] = '(' f[i] = 2 + f[i - 2]
    7. s[i-1] = ')' 判断s[i - f[i-1] - 1] == '('
    8. }
    9. */
    10. public int longestValidParentheses(String s) {
    11. char[] ch = s.toCharArray();
    12. int n = ch.length;
    13. int[] f = new int[n + 1];
    14. f[0] = 0;
    15. int res = 0;
    16. for (int i = 1; i < n; ++i) {
    17. //ch[i] == '(' 时 f[i] = 0;
    18. if (ch[i] == ')') {
    19. if (ch[i - 1] == '(') {
    20. f[i] = 2;
    21. if (i > 1) f[i] += f[i - 2];
    22. }
    23. else if (f[i - 1] > 0 && i - f[i - 1] - 1 >= 0) {
    24. //f[i - 1] > 0 必须保证ch[i - 1]这个括号是有效的
    25. if (ch[i - f[i - 1] - 1] == '(') {
    26. f[i] = f[i - 1] + 2;
    27. //加上之前的部分
    28. if (i - f[i - 1] - 2 >= 0)
    29. f[i] += f[i - f[i - 1] - 2];
    30. }
    31. }
    32. }
    33. res = Math.max(res, f[i]);
    34. }
    35. return res;
    36. }
    37. }