C. Replace To Make Regular Bracket Sequence

C. Replace To Make Regular Bracket Sequence
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
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.

Examples
input
[<}){}
output
2
input
{()}[]
output
0
input
]]
output
Impossible

题的大致意思是输入的左括号可以变,而右括号不可以变,那么请你算一下至少要变多少次?
用stack,每次将左括号压进stack里面,遇到右括号就判断一下就好了
方法就很简单,看看栈最后是否还有,看看右括号的时候,左括号的栈是否为空。

代码如下:

#include <algorithm>
#include<bits/stdc++.h>
#include <cstdio>
#include <math.h>
#include <string.h>
#include <stack>      //栈头文件
#include <queue>      //队列头文件
using namespace std;
string s;
stack<char> sta;
int main()
{
    cin>>s;
    int ans = 0;
    for(int i=0;i<s.size();i++)
    {

        if(s[i]==']')
        {
            if(sta.empty())
                return puts("Impossible");
            if(sta.top()=='[')
                sta.pop();
            else
            {
                ans++;
                sta.pop();
            }
        }
        else if(s[i]==')')
        {
            if(sta.empty())
                return puts("Impossible");
            if(sta.top()=='(')
                sta.pop();
            else
            {
                ans++;
                sta.pop();
            }
        }
        else if(s[i]=='>')
        {
            if(sta.empty())
                return puts("Impossible");
            if(sta.top()=='<')
                sta.pop();
            else
            {
                ans++;
                sta.pop();
            }
        }
        else if(s[i]=='}')
        {
            if(sta.empty())
                return puts("Impossible");
            if(sta.top()=='{')
                sta.pop();
            else
            {
                ans++;
                sta.pop();
            }
        }
        else sta.push(s[i]);
    }
    if(!sta.empty()) return puts("Impossible");
    printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值