150. 括号画家 栈

2024-01-28 15:48
文章标签 括号 150 画家

本文主要是介绍150. 括号画家 栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

150. 括号画家

达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。

这一天,刚刚起床的达达画了一排括号序列,其中包含小括号 ( )、中括号 [ ] 和大括号 { },总长度为 NN。

这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:

  1. 空的括号序列是美观的;
  2. 若括号序列 AA 是美观的,则括号序列 (A)(A)、[A][A]、{A}{A} 也是美观的;
  3. 若括号序列 A、BA、B 都是美观的,则括号序列 ABAB 也是美观的。

例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是。

现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。

你能帮帮她吗?

输入格式

输入一行由括号组成的字符串。

输出格式

输出一个整数,表示最长的美观的子段的长度。

数据范围

字符串长度不超过 10^5。

输入样例:

({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)

输出样例:

4

思路:由题意得:如果某一段是合法的,那么它们中间的也是合法的。我们用栈来存储左括号,
当遇到左括号时就入栈,遇到右括号时就和栈顶的左括号配对,如果配对成功就将标记左右两端为true;
如果没有配对成功,就清空栈。操作完之后,我们遍历序列,当左端点i满足时,遍历有右端点,当碰到右端点不满足时,就及时更新这一段的长度。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
bool vis[maxn];//做标记的 
char s[maxn],zk[maxn],yk[maxn];//s为输入的字符串,zk为左括号的栈,yk为右括号 
int pos[maxn],ans,num;
int main(){scanf("%s",s+1);int n=strlen(s+1);yk[')']='(',yk[']']='[',yk['}']='{';for(int i=1;i<=n;i++){if(yk[s[i]]){if(yk[s[i]]==zk[num]){vis[i]=vis[pos[num]]=true;num--;//右括号与栈顶左括号配对,标记两端,弹出栈顶元素; }else num=0;//清空栈顶元素 }else{zk[++num]=s[i];pos[num]=i;}}int j; for(int i=1;i<=n;i++){if(vis[i]){for(j=i;j<=n;j++){if(!vis[j]) break;else vis[j]=false;}ans=max(ans,j-i);//对于每一个前面的为true的i,都只有一个对应的j,所以每一次都是碰到不满足的右括号时就先更新前面的长度。 }}cout<<ans<<endl;return 0;
}

这篇关于150. 括号画家 栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654083

相关文章

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

括号匹配问题(nyoj2)

括号配对问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[

vim 括号匹配 以及各种好用跳转技巧

括号匹配: % 可以让光标从它当前所在的括号跳转到与它相匹配的括号上去, 对花括号和 圆括号, 方括号都有效, 常用于手工检查括号是否匹对. 标示位置 -------- 你可以在档案□做些标记再随时返回被标记的位置. m char (MARK) 把这个地方标示成 char ' char (quote character) 跳到被标为 char的

vim匹配括号之间内容

示例代码如下: var tpl = ['<a href="{url}">{title}</a>'] 我们想要找到{url}之间的内容 光标移动至 {url},输入vi{ 分隔符对象 文本对象选择区域a) 或 ab一对圆括号 (parentheses)i) 或 ib圆括号 (parentheses) 内部a} 或 aB一对花括号 {braces}i} 或 iB花括号 {braces}

sublime text3按tab键跳出括号、双引号设置

直接在Preferences->Key Bindings中文界面为首选项->快捷键设置中添加下列代码: { "keys": ["tab"], "command": "move", "args": {"by": "characters", "forward": true}, "context":[{ "key": "following_text", "operator": "regex_conta

Leetcode面试经典150题-83.删除链表中的重复元素

解法都在代码里,不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int va

Leetcode22括号生成(java实现)

今天分享的题目是Leetcode22括号生成,具体的题目描述如下: 本道题我们使用的解法是回溯。 解题思路: 我们主要是对括号出现的可能性进行一个收集。 我们以n=2举例子,如下图 如果想要合法,那么一定是左括号开始,并且以左括号为开始,要对不合适的进行剔除。可以思考一下,为何最后一个不符合呢?是因为左括号个数为1,右括号个数为1,然后没有以左括号开始。 上面的两种情况合法,第一种情况,左括

力扣面试150 分隔链表 模拟

Problem: 86. 分隔链表 👨‍🏫 参考题解 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val