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 ands2 be a RBS then the strings<s1>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.
InputThe only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length ofs does not exceed106.
If it's impossible to get RBS from s printImpossible.
Otherwise print the least number of replaces needed to get RBS from s.
[<}){}
2
{()}[]
0
]]
Impossible
题意:符号配对,替换同等方向符号使其配对;
思路:刚开始看感觉很难,其实仔细想,就是简单的模拟 + 栈,代码有解析;
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[1000000+10];
int main()
{
int i,k;
while(scanf("%s",a)!=EOF)
{
int len=strlen(a);
if(len%2)//奇数不会最后成对 ;
{
printf("Impossible\n");
continue;
}
stack<char> s;
bool flag=true;
k=0;
for(i=0;i<len;i++)
{
if(a[i]=='<' || a[i]=='(' || a[i]=='{' || a[i]=='[')//直接压入栈;
s.push(a[i]);
else
{
if(a[i]=='>')
{
if(s.empty() || s.top()=='}' || s.top()==')' || s.top()==']')
{ //仔细思考,这四种情况可以终止循环了;
flag=false;
break;
}
else if(s.top()=='<')
s.pop();
else if(s.top()=='{' || s.top()=='(' || s.top()=='[')
{ //可以替换字符;
k++;
s.pop();
}
}
if(a[i]=='}')
{
if(s.empty() || s.top()=='>' || s.top()==')' || s.top()==']')
{
flag=false;
break;
}
else if(s.top()=='{')
s.pop();
else if(s.top()=='<' || s.top()=='(' || s.top()=='[')
{
k++;
s.pop();
}
}
if(a[i]==']')
{
if(s.empty() || s.top()=='}' || s.top()==')' || s.top()=='>')
{
flag=false;
break;
}
else if(s.top()=='[')
s.pop();
else if(s.top()=='{' || s.top()=='(' || s.top()=='<')
{
k++;
s.pop();
}
}
if(a[i]==')')
{
if(s.empty() || s.top()=='}' || s.top()=='>' || s.top()==']')
{
flag=false;
break;
}
else if(s.top()=='(')
s.pop();
else if(s.top()=='{' || s.top()=='<' || s.top()=='[')
{
k++;
s.pop();
}
}
}
}
if(!s.empty() || !flag)
printf("Impossible\n");
else printf("%d\n",k);
}
return 0;
}