方法一:栈
首先我们先要看懂题目的意思(没错,开始我就没搞懂)
感觉用到我们实际的代码中比较好里面,最长有效括号的重点在于有效,就比如 (( a + b ) + ( c + d ) + e ) 最长的有效括号就是 第一个左括号,和最后一个右括号。
那么我们可以观察出
- 括号都是成对出现才会是有效的
- 右括号一定在左括号后出现才是有效的
找到有效的括号能够找到,那么“最长”有效括号也就不难了,使用一个变量存放就可以了。
所以我们可以使用一个辅助栈存放待匹配的左括号,
- 遍历到左括号,存入栈中
- 遍历到右括号,出栈一个元素
- 栈为空:将该元素 push 进栈(作为参照元素,后续计算 长度 的时候会用到)
- 栈不为空:记录下两个括号的 index 差值。
同时因为辅助栈里面存放的都是左括号,所以只需要将 index 存入即可。
class Solution {public:int longestValidParentheses(string s) {int maxans = 0;stack<int> stk;stk.push(-1);for (int i = 0; i < s.length(); i++) {if (s[i] == '(') {stk.push(i);} else {stk.pop();if (stk.empty()) {stk.push(i);} else {maxans = max(maxans, i - stk.top());}}}return maxans;}};作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
