返回顶部

[day005]32. 最长有效括号

32. 最长有效括号

Difficulty: 困难

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

示例 1:

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

示例 2:

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

Solution 1 栈

​class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> st;st.push(-1);
        int length = s.length(),maxLength = 0;
        for(int i = 0;i<length;++i){
            if(s[i] == '('){
                st.push(i);
            } else {
                int cur = st.top();
                st.pop();
                if(st.empty()){
                    //if index of -1 pops,then this is the last invalid position of right
                    //parentheres
                    st.push(i);
                } else {
                    maxLength = max(maxLength,i-st.top());
                    //at least there is an index -1 if it's valid
                }
            }
        }
        return maxLength;
    }
};

思路

  • 对于这类括号匹配这种情况,基本上第一想法都是栈,左括号进栈,右括号出栈。
  • 栈底维护了当前最右不匹配右括号下标,如果能排空栈,则说明当前这个右括号即为最右不匹配右括号,把下标入栈,如果不能排空,则说明能匹配上,更新最大匹配括号的子串的长度即可
  • 可以假设最左边有一个),使得一开始只有(的入栈的情况得以统一,即先把最右不匹配右括号下标为-1入栈。
posted @ 2020-07-04 21:12  Swetchine  阅读(117)  评论(0编辑  收藏  举报