32. 最长有效括号

88 阅读1分钟

32. 最长有效括号

难度:困难

题目详情:

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

示例 1:

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

示例 2:

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

示例 3:

  • 输入:s = ""
  • 输出:0  

提示:

0 <= s.length <= 3 * 104

s[i] 为 '(' 或 ')'

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> stk;
        stk.push(-1);
        int maxLen = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (s[i] == '(') {
                stk.push(i);
            }else {
                stk.pop();
                if (stk.empty()) {
                    stk.push(i);
                } else {
                    maxLen = max(maxLen, i - stk.top());
                }
            }
        }
        return maxLen;
};

以下我写一下我做这道题的收获:

  1. 不能把这道题跟括号匹配相混淆(虽然都可以用栈解决)
  2. 这道题让我第一次接触到用下标和栈的top元素得到最长有效括号的长度;这个是即时处理的;
  3. 大多数题目都可以在第一个元素前面加一个dummy,来解决第一个元素需要单独讨论的局面,进而优化我们的做法,做链表时就有所体现

动态规划和并不需要额外空间的做法,现在学识短浅,等到能够理解时再来添加;

注:现在还属于初学者,后面会对这些代码进行优化和方法的补充