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;
    }
    
    
  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026799.html
Copyright © 2011-2022 走看看