• Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈


    C. Replace To Make Regular Bracket Sequence

    题目连接:

    http://www.codeforces.com/contest/612/problem/C

    Description

    You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). There are two types of brackets: opening and closing. You can replace any bracket by another of the same type. For example, you can replace < by the bracket {, but you can't replace it by ) or >.

    The following definition of a regular bracket sequence is well-known, so you can be familiar with it.

    Let's define a regular bracket sequence (RBS). Empty string is RBS. Let s1 and s2 be a RBS then the strings s2, {s1}s2, [s1]s2, (s1)s2 are also RBS.

    For example the string "[[(){}]<>]" is RBS, but the strings "[)()" and "][()()" are not.

    Determine the least number of replaces to make the string s RBS.

    Input

    The only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length of s does not exceed 106.

    Output

    If it's impossible to get RBS from s print Impossible.

    Otherwise print the least number of replaces needed to get RBS from s.

    Sample Input

    [<}){}

    Sample Output

    2

    Hint

    题意

    给你一个只含有括号的字符串,你可以将一种类型的左括号改成另外一种类型,右括号改成另外一种右括号

    问你最少修改多少次,才能使得这个字符串匹配,输出次数

    题解:

    用stack,每次将左括号压进stack里面,遇到右括号就判断一下就好了

    非法就很简单,看看栈最后是否还有,看看右括号的时候,左括号的栈是否为空

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    string s;
    stack<char> S;
    int main()
    {
        cin>>s;
        int ans = 0;
        for(int i=0;i<s.size();i++)
        {
    
            if(s[i]==']')
            {
                if(S.size()==0)return puts("Impossible");
                if(S.top()=='[')
                    S.pop();
                else
                {
                    ans++;
                    S.pop();
                }
            }
            else if(s[i]==')')
            {
                if(S.size()==0)return puts("Impossible");
                 if(S.top()=='(')
                    S.pop();
                else
                {
                    ans++;
                    S.pop();
                }
            }
    
            else if(s[i]=='>')
            {
                if(S.size()==0)return puts("Impossible");
                if(S.top()=='<')
                    S.pop();
                else
                {
                    ans++;
                    S.pop();
                }
            }
            else if(s[i]=='}')
            {
                if(S.size()==0)return puts("Impossible");
                 if(S.top()=='{')
                    S.pop();
                else
                {
                    ans++;
                    S.pop();
                }
            }
            else S.push(s[i]);
        }
        if(S.size()!=0)return puts("Impossible");
        cout<<ans<<endl;
    }
  • 相关阅读:
    ADO.NET批量插入数据方法比较
    Thread was being aborted 分析与解决
    第三方刻录软件介绍
    ASP.NET登陆SQL Server数据库
    word 2010页眉页码从第三页开始设置
    误删除、误格式化后的灾难恢复方案
    Asp.Net4.0新特性概述
    ArcGIS Server的切图原理深入
    ArcGIS的缓存技术
    ArcGIS Server操作Mxd文件详细讲解
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5081815.html
Copyright © 2020-2023  润新知