括号画家

括号画家

https://ac.nowcoder.com/acm/problem/50998

题意

有三种括号'{}','[]','()',找出最长连续匹配的括号,输出其长度。

分析

括号匹配用栈来模拟,每次将括号与栈顶元素进行匹配,然后将配对的括号出栈,并且当前连续匹配的括号长度+2,如果遇到不配对的括号了,将其入栈并且连续长度置为0,即前面连续匹配长度计算完毕,每次在进行一个max比较。

代码

#include <bits/stdc++.h>

using namespace std;

string s;
stack<char> sk;
int cnt,ans;

int main(){
    cin>>s;
    sk.push(s[0]);
    for(int i = 1; i < s.size(); i++){
        if(s[i] == ')' && sk.top() == '('){
            cnt += 2;
            sk.pop();
        }
        else if(s[i] == '}' && sk.top() == '{'){
            cnt += 2;
            sk.pop();
        }
        else if(s[i] == ']' && sk.top() == '['){
            cnt += 2;
            sk.pop();
        }
        else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){
            cnt = 0;    //只有遇到右括号且与栈顶元素不配对的时候,就代表连续子序列匹配结束
            sk.push(s[i]);
        }
        else
            sk.push(s[i]);    //左括号仍有机会配对成功,直接入栈
        ans = max(ans,cnt);
    }
    cout<<ans<<endl;
    return 0;
}
全部评论
((({}[]((() 应输出 4 输出了 6
点赞
送花
回复 分享
发布于 2022-08-12 22:43
())((()))(())会发生段错误
点赞
送花
回复 分享
发布于 2023-11-10 18:56 湖北
国泰君安
校招火热招聘中
官网直投

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务