难度:困难
题目详情:
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 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;
};
以下我写一下我做这道题的收获:
- 不能把这道题跟括号匹配相混淆(虽然都可以用栈解决)
- 这道题让我第一次接触到用下标和栈的top元素得到最长有效括号的长度;这个是即时处理的;
- 大多数题目都可以在第一个元素前面加一个dummy,来解决第一个元素需要单独讨论的局面,进而优化我们的做法,做链表时就有所体现
动态规划和并不需要额外空间的做法,现在学识短浅,等到能够理解时再来添加;
注:现在还属于初学者,后面会对这些代码进行优化和方法的补充