zoukankan      html  css  js  c++  java
  • AcWing

    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
    ", sum);
    }
    
  • 相关阅读:
    附加作业
    我的个人总结
    进度更新
    结对编程——电梯调度
    程序阅读的改进
    WordCount
    阅读程序
    VS2013单元测试
    附加作业
    个人最终总结
  • 原文地址:https://www.cnblogs.com/Inko/p/11423111.html
Copyright © 2011-2022 走看看