码迷,mamicode.com
首页 > Windows程序 > 详细

AcWing - 150 - 括号画家 = 栈

时间:2019-08-28 12:42:52      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:stdin   括号   com   win   pre   插入   end   ==   names   

https://www.acwing.com/problem/content/152/

思路:开一个pair栈,第一个元素存字符的种类,第二个元素存“这个字符之后曾经匹配过的最大长度”。

为什么是“这个字符之后”,我也很难说清楚,但是感觉这样是对的。某一次遇到右括号弹栈之后,顺便把栈顶的最大长度也update了。

一开始插入一个虚拟节点就不需要判空了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

char ss[100005];
stack<pair<char, int> > s;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int sum = 0;
    scanf("%s", ss);
    int n = strlen(ss);
    s.push({'#', 0});
    for(int i = 0; i < n; ++i) {
        if(ss[i] == ')') {
            if(s.top().first == '(') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else if(ss[i] == ']') {
            if(s.top().first == '[') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else if(ss[i] == '}') {
            if(s.top().first == '{') {
                int tmp = s.top().second;
                s.pop();
                char c2 = s.top().first;
                int tmp2 = s.top().second;
                s.pop();
                s.push({c2, tmp2 + tmp + 2});
                sum = max(sum, tmp2 + tmp + 2);
            } else {
                s.push({ss[i], 0});
            }
        } else {
            s.push({ss[i], 0});
        }
    }
    printf("%d\n", sum);
}

AcWing - 150 - 括号画家 = 栈

标签:stdin   括号   com   win   pre   插入   end   ==   names   

原文地址:https://www.cnblogs.com/Inko/p/11423111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!