LeetCode 32. Longest Valid Parentheses(最长有效括号,C++)

题目
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.

Example 1:
Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”

Example 2:
Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”

题意:先理解题意,刚开始以为是求给定字符串中匹配括号占的字符数(匹配括号对数*2)。程序提交上去发现有下面的错误例子,
LeetCode 32. Longest Valid Parentheses(最长有效括号,C++)_第1张图片
按照括号匹配的原则位于0,1位置和3,4位置(从0开始算)的括号能分别配对,所以一共4个括号字符能配对,但是结果是2,再仔细看了下题真实的题意是求最长连续匹配的括号占的字符数。

思路:这题的关键是在给定的字符串中找出左括号“(”和右括号“)”匹配的数量。这里关键是用到了,初始化一个栈stk,从左到右遍历给定的字符串s的每个字符,如果栈为空不管是左括号还是右括号都放入栈中,如果栈不空,并且此时栈顶为左括号“(”且下一个要处理的字符为右括号“)”,此时将栈顶元素出栈表示一对括号匹配完成记录下该对括号的位置,其他情况一律将待处理元素入栈,之后处理字符串s的下一个字符,直到处理完所有的字符。为了求最长的匹配括号数,使用了一个辅助数组arr大小和字符串s的大小一样,入栈时不仅记录入栈的括号是左括号还是右括号,增加一个index域表示括号的下标,这样方便在上面括号匹配完成时,在arr数组中设置匹配成功的括号位置为1,最后只需要求arr数组中最长的连续为1的元素个数

代码(C++)

typedef struct message{
    char ch;
    int index;
     message(char ch, int index) : ch(ch), index(index) {}
}Message;
class Solution {
public:
    int longestValidParentheses(string s) {
        stack<Message> stk;
        int * arr = new int[s.length()];
        int n = 0;
        int result = 0;
        while(n<s.length()){
            if(stk.empty())
                stk.push(Message(s[n], n));
            else{
                if(stk.top().ch=='(' && s[n] ==')'){
                    Message msg = stk.top();
                    arr[n] = 1;arr[msg.index]=1;
                    stk.pop();//pop返回值为void
                }
                else{
                    stk.push(Message(s[n], n));
                }
            }
            n++;
        }
        int len = 0;
        for(int i = 0; i<s.length(); i++){//找最长的连续成对括号子串长度,就是arr数组最长的连续1的个数
            if(arr[i]==1){
                len++;
            }else{
                if(len>result)
                    result = len;
                len = 0;
            }
        }
        if(len>result)//如果最后一个元素为1,此时在这里处理len
            result = len;
        return result;
    }
        
};

你可能感兴趣的:(Leetcode)