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  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.计数
在此方法中,我们利用两个计数器 \textit{left}left 和 \textit{right}right 。首先,我们从左到右遍历字符串,对于遇到的每个 \text{‘(’}‘(’,我们增加 \textit{left}left 计数器,对于遇到的每个 \text{‘)’}‘)’ ,我们增加 \textit{right}right 计数器。每当 \textit{left}left 计数器与 \textit{right}right 计数器相等时,我们计算当前有效字符串的长度,并且记录目前为止找到的最长子字符串。当 \textit{right}right 计数器比 \textit{left}left 计数器大时,我们将 \textit{left}left 和 \textit{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. 最长有效括号. ①栈)