列表

详情


BM77. 最长的括号子串

描述

给出一个长度为 n 的,仅包含字符 '(' 和 ')' 的字符串,计算最长的格式正确的括号子串的长度。

例1: 对于字符串 "(()" 来说,最长的格式正确的子串是 "()" ,长度为 2 .
例2:对于字符串 ")()())" , 来说, 最长的格式正确的子串是 "()()" ,长度为 4 .

字符串长度:

要求时间复杂度 ,空间复杂度 .

示例1

输入:

"(()"

输出:

2

示例2

输入:

"(())"

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 504KB, 提交时间: 2021-06-12

static const auto io_sync_off = []()
{
    // turn off sync
    std::ios::sync_with_stdio(false);
    // untie in/out streams
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        vector<int> idx_record( {-1} );
        int len = s.length(), max = 0, tmp;
        for(int i=0; i<len; i++){
            if(s[i] == '('){ idx_record.push_back(i);   continue; }
            idx_record.pop_back();
            if( idx_record.empty() ){
                idx_record.push_back(i);   continue;
            }
            if((tmp = i-idx_record.back()) > max) max = tmp;
        }
        return max;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 508KB, 提交时间: 2020-08-17

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        if(s.length() < 1){
            return 0;
        }
        
        int L = s.length();
        
        stack<int> stk;
        int maxL = 0;
        int last = -1;
        int i;
        for(i = 0; i<L; i++){
            if(s.at(i) == '('){
                stk.push(i);
            }
            else{
                if(stk.empty()){
                    last = i;
                }
                else{
                    stk.pop();
                    if(stk.empty()){
                        maxL = max(maxL, i - last);
                    }
                    else{
                        maxL = max(maxL, i - stk.top());
                    }
                }
            }
        }
        return maxL;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 520KB, 提交时间: 2021-07-26

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        stack<int>stk;
        stk.push(-1);
        int res=0;
        int len=s.size();
        for(int i=0;i<len;++i){
            if(s[i]=='(')
                stk.push(i);
            else{
                stk.pop();
                if(!stk.empty()){
                    int temp=stk.top();
                    res=max(res,i-temp);
                }else{
                    stk.push(i);
                }
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 520KB, 提交时间: 2021-07-23

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here

//        stack<char>st;
//        st.push(-1);
//        int res = 0;
        
        
        stack<int> st;
        st.push(-1);
        int res = 0;
        
        
        for(int i = 0; i < s.size(); ++i){
            if(s[i] == '(') st.push(i);
            else{
                st.pop();
                if(st.empty()) st.push(i);//之前那个已经无法匹配,开始新的子串
                else res = max(res, i - st.top());
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 520KB, 提交时间: 2021-07-21

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        if(s.empty())
        {
            return 0;
        }
        stack<int>st;
        st.push(-1);
        int res = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == '(')
            {
                st.push(i);
            }
            else if(s[i] == ')')
            {
                st.pop();
                if(st.empty())
                {
                    st.push(i);
                }
                else
                {
                    res = max(res, i - st.top());
                }
            }
        }
        
        return res;
    }
};

上一题