Openjudge 1、括号替换

Openjudge 1、括号替换

  • 1:括号替换
  • 描述
  • 输入
  • 输出
  • 样例输入
  • 样例输出
  • 思路
  • 代码

1:括号替换

总时间限制: 1000ms 内存限制: 262144kB

描述

给定字符串S,S中包含4种括号 <>, {}, [], (),每种括号又可分为左括号和右括号。

对于字符串S,我们定义了替换操作:使用以上四种括号中的一种左括号替换另一种左括号(或者一种右括号替换另一种右括号)。但是,我们不能用左括号替换右括号。

例如:可以使用 “<” 替换 “{” ,但是不能用 “<” 替换 “)” 或 “>”。

接下来我们定义regular bracket sequence(RBS): 首先,空字符串是RBS。

如果 s1,s2 是RBS,则 s2, {s1}s2,[s1]s2,(s1)s2 也是RBS。

例如:字符串 “[[(){}]<>]” 是RBS,但是字符串 “[)()” 和字符串 “][()()” 不是RBS。

请对于给定的字符串S,判断至少需要多少次替换,可以将S变为RBS。

输入

输入1行,为字符串S,仅包含上述4种括号且S不为空串。
S的⻓度不超过106。

输出

如果可以通过替换操作使得S变为RBS,则输出变为RBS所需要的最少替换次数。
如果不能通过替换操作使得S变为RBS,则输出"Impossible"。

样例输入

样例输入1:
[<}){}

样例输入2:
{()}[]

样例入3:
]]

样例输出

样例输出1:
2

样例输出2:
0

样例输出3:
Impossible

思路

这个很容易看出是在考察栈的使用,这里需要注意的一点在于,不仅仅是在爆栈的时候返回impossible,而且如果最后栈都不空的话,证明有过多的左括号,这也是不符合要求的。

代码

#include 
#include 
#include 
using namespace std;

int main(){
    stack<char> st;
    string tmp;
    cin >> tmp;
    int ans = 0;
    for(int i = 0; i < tmp.length(); ++ i){
        char c = tmp[i];
        if(c == '{' || c == '[' || c == '(' || c == '<'){
            st.push(c);          
        }
        else
        {
            if(st.empty())
            {
                cout<<"Impossible"<<endl;
                return 0;
            }
            char last = st.top();
            st.pop();

            if(c == '}'){
                if(last != '{') ans ++;
            }
            else if(c == ']')
            {
                if(last != '[') ans ++;
            }
            else if(c == '>'){
                if(last != '<') ans ++;
                
            }
            else if(c == ')')
            {
                if(last != '(') ans ++;
            }
        }
        
    }
    if(st.empty())
        cout<<ans <<endl;
        else
        {
            cout<<"Impossible";
        }
        return 0;
}

你可能感兴趣的:(Openjudge题解,数据结构与算法,算法,c++,开发语言)