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)。程序提交上去发现有下面的错误例子,
在这里插入图片描述
按照括号匹配的原则位于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;
    }
        
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值