AcWing - 150 - 括号画家 = 栈

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);
}

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

时间: 2024-08-30 12:53:25

AcWing - 150 - 括号画家 = 栈的相关文章

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出

括号匹配[栈]

题目:求字符串[(())]的括号是否匹配,这个题相对比较简易,也记录一下.思路,左括号就入栈,遇到右括号就出栈一个元素进行匹配判定,构造一个switch.同时,设置一个监视flag,初始置1,一旦不匹配就将之置为0,也就是以后就不用再比较了. #include <iostream> using namespace std; #define maxsize 10 typedef struct stack { char a[maxsize]; int top; }stack,*Stack; voi

括号匹配(栈的应用)

#include <iostream> #include <stack> #include <string> using namespace std; int main() { int n;cin>>n; while(n--){ stack<char> s; string str;cin>>str; for(int i=0;i!=str.length();i++){ if(s.empty()) s.push(str[i]); else

Leetcode 856. Score of Parentheses 括号得分(栈)

Leetcode 856. Score of Parentheses 括号得分(栈) 题目描述 字符串S包含平衡的括号(即左右必定匹配),使用下面的规则计算得分 () 得1分 AB 得A+B的分,比如()()得2分 (A) 得2A分, 比如(()())得2(1+1)分 测试样例 Example 1: Input: "()" Output: 1 Example 2: Input: "(())" Output: 2 Example 3: Input: "()(

UVa 673 Parentheses Balance(括号配对 栈)

题意  判断输入的括号序列是否是配对的 栈的基础应用  栈顶元素与输入的字符匹配就出栈咯  注意括号序列可以为空 STL栈 #include <bits/stdc++.h> using namespace std; int main() { int cas; char c; cin >> cas; getchar(); while(cas--) { stack<char> s; while((c = getchar()) != '\n') { if(s.empty())

数据结构实验之栈四:括号匹配(栈)

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出"yes",不匹配输出"no" 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 来源 ma6174

合法括号【栈】

合法括号 发布时间: 2018年4月2日 20:46   时间限制: 1000ms   内存限制: 128M 描述 给定字符串,只包含以下括号:'(', ')', '{', '}', '[' and ']' , 判断输入是否合法.括号匹配必按照要求:"()" and "()[]{}", 而不是 "(]" and "([)]" 输入 输入包含多组测试数据,每组测试数据占一行,不超过80个字符的字符串. 输出 对于每组测试数据,如

20. 有效的括号(栈的使用)

题目描述:括号(小括号.中括号.大括号)的匹配 传送门:https://leetcode-cn.com/problems/valid-parentheses/ 解法:<数据结构>中作为例子引出栈的概念.用一个栈维护,从左到右扫描目标字符串,如果括号匹配,即满足三种情况: ①.s[i] == ')' && Stack.top() == '(' ②.s[i] == ']' && Stack.top() == '[' ③.s[i] == '}' &&

括号画家

# 题意 一共有3种括号,空的括号是美观的(1) 空的括号序列是美观的:(2) 若括号序列A是美观的,则括号序列 (A).[A].{A} 也是美观的:(3) 若括号序列A.B都是美观的,则括号序列AB也是美观的.例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是.现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大. # 题解 栈中保存前括号的下标,扫描,匹配上时出栈,不匹配跳过,若栈不空,用当前下标减栈中中标,因为当前未匹配入展,所以不合