32. 最长有效括号. ①栈

Posted xgbt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32. 最长有效括号. ①栈相关的知识,希望对你有一定的参考价值。

给定一个只包含 ‘(‘?和 ‘)‘?的字符串,找出最长的包含有效括号的子串的长度。

示例?1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.栈
入栈的是下标,左括号入栈,右括号出栈,若为空,右括号自己入栈,若非空,出栈,然后用当前下标减去栈顶下标,这个结果就是当前右括号为结尾的有效括号长度。

class Solution {
public:
    int longestValidParentheses(string s) {
        int ans = 0;
        stack <int> st;
        st.push(-1);

        for (int i = 0; i < s.size(); i++){
            if (s[i] == ‘(‘){
                st.push(i);
            }
            else{
                st.pop();
                if (st.empty()) st.push(i);
                else ans = max(ans, i - st.top());
            }
        }

        return ans;
    }
};

2.计数
在此方法中,我们利用两个计数器 extit{left}left 和 extit{right}right 。首先,我们从左到右遍历字符串,对于遇到的每个 ext{‘(’}‘(’,我们增加 extit{left}left 计数器,对于遇到的每个 ext{‘)’}‘)’ ,我们增加 extit{right}right 计数器。每当 extit{left}left 计数器与 extit{right}right 计数器相等时,我们计算当前有效字符串的长度,并且记录目前为止找到的最长子字符串。当 extit{right}right 计数器比 extit{left}left 计数器大时,我们将 extit{left}left 和 extit{right}right 计数器同时变回 00。

class Solution {
public:
    int longestValidParentheses(string s) {
        int l,r;
        int ans = 0;

        l = 0; r = 0;
        for (int i = 0; i < s.size(); i++){
            if (s[i] == ‘(‘) l++;
            else r++;
            if (l == r) ans = max(ans, l + r);
            if (l < r) l = 0, r = 0;
        }

        l = 0; r = 0;
        for (int i = s.size() - 1; i >= 0; i--){
            if (s[i] == ‘(‘) l++;
            else r++;
            if (l == r) ans = max(ans, l + r);
            if (l > r) l = 0, r = 0;
        }

        return ans;
    }
};









以上是关于32. 最长有效括号. ①栈的主要内容,如果未能解决你的问题,请参考以下文章

leetcode困难32最长有效括号

⭐算法入门⭐《栈》困难01 —— LeetCode 32. 最长有效括号

leetcode题解之32. 最长有效括号

[leetcode] 32. 最长有效括号

leetcode:32 最长有效括号

最长有效括号