【每日刷题】最长有效括号

时间:2019-01-18
本文章向大家介绍【每日刷题】最长有效括号,主要包括【每日刷题】最长有效括号使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

day22, 最长有效括号

题目来源:leetcode
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

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

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

解答:该题目最主要的问题是如何保存最长的有效括号长度。
加入辅助数组,左括号直接进栈,右括号主要看栈中数符。

int longestValidParentheses(string s) {
        stack<char> record;
        vector<int> result;
        for( int i = 0; i < s.size(); i++){
            if( record.empty() && s[i] == ')'){
                record.push(')');
                continue;
            }
            if( s[i] == '('){
                for( int j = 0; j < result.size(); j++)
                    record.push('2');
                result.clear();     
                record.push( s[i]);
                continue;
            }
            if( !record.empty() && s[i] == ')'){
                if( record.top() == '('){
                    record.pop();        
                    record.push('2');
                }
                else if( record.top() == '2'){
                    while( !record.empty() && record.top() == '2'){
                        record.pop();
                        result.push_back(2);
                    }
                    if( !record.empty() && record.top() == '('){
                        record.pop();
                        result.push_back(2);
                        for( int j = 0; j < result.size(); j++)
                            record.push('2');
                        result.clear();
                    }
                    else if( (!record.empty() && record.top() == ')') || record.empty()){
                        for( int j = 0; j < result.size(); j++)
                            record.push('2');
                        result.clear();
                        record.push(')');
                    }
                }
                else
                    record.push( s[i]);
                
            }
            
        }
        int maxDis = 0, dis = 0; 
        while( !record.empty()){
            if( record.top() == '2'){
                dis+=2;
                record.pop();
                if( dis > maxDis)
                    maxDis = dis;
            }        
            else
                dis = 0,  record.pop();
        }
                
        return maxDis;
    }

运行结果:


我的微信公众号