zoukankan      html  css  js  c++  java
  • #栈 ——Acwing 150. 括号画家

    150.、括号画家

    题目

    达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。
    
    这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( )、中括号[ ]和大括号{ },总长度为N。
    
    这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:
    
    (1) 空的括号序列是美观的;
    
    (2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;
    
    (3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。
    
    例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是。
    
    现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。
    
    你能帮帮她吗?
    
    输入格式
    
    输入一行由括号组成的字符串。
    
    输出格式
    
    输出一个整数,表示最长的美观的子段的长度。
    
    数据范围
    
    字符串长度不超过100000。
    
    输入样例:
    ({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)
    输出样例:
    4
    

    答案

    #include<bits/stdc++.h>
    using namespace std;
    int ans=0;
    stack<int>s;
    string str;
    int main()
    {
    	cin>>str;
    	for(int i=0;i<str.size();i++)
    	{
    		if(!s.empty() && (str[i]==')'&&str[s.top()]=='(' || str[i]==']'&&str[s.top()]=='[' || str[i]=='}'&&str[s.top()]=='{') )
    		//如果栈不为空且可以匹配一个,那就出一个括号; 
    			s.pop();
    		else s.push(i);//如果栈没东西或者没有可以匹配的括号,那当前元素入栈 
    		
    		if(s.empty()) ans=max(ans,i+1);//如果栈空了那就说明目前整条都是美观的 
    		else ans=max(ans,i-s.top());//如果栈没空那就算 已完成匹配的 长度 
    	}
    	printf("%d",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    模版的完全特化与偏特化
    [转]windows消息机制(MFC)
    MFC宏常识
    半透明AlphaBlend
    new、operator new、placement new
    DuplicateHandle
    Mac OS X 更新JAMF域控配置
    生成自签名CA+SSL证书
    Office 2016系列下载地址
    Spring Security静态资源访问
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026799.html
Copyright © 2011-2022 走看看