【题目大意】
括号匹配问题,同侧不同类型的可以替换,不同侧的不可以替换,给定一串四种括号构成的字符串,输出最少的替换次数,或者输出不可能。
【解题思路】
利用STL里的stack,根据输入push或者pop检测即可。
注意strlen的使用。萌新在for循环判断语句里用了strlen,直接导致TLE,以后一定避免多次重复调用统一函数,先把数值存起来。
【解题代码】
#include <cstdio>
#include <cstring>
#include <stack>
#define maxn 1000010
using namespace std;
char c[maxn];
int main()
{
stack<char> s;
scanf("%s", c);
int count = 0;
int i,flag = 0;
int len=strlen(c);
if (len % 2) flag = 1;//根据偶数配对先行判断一次
else
{
for (i = 0; i < len; i++)//就是在这里栽跟头了,循环判断里不应调用strlen
{
if (c[i] == '<' || c[i] == '(' || c[i] == '{' || c[i] == '[')
s.push(c[i]);
else if (!s.empty())
{
char getc=s.top();
s.pop();
if(c[i]=='>'&&getc!='<') count++;
else if(c[i]=='}'&&getc!='{') count++;
else if(c[i]==')'&&getc!='(') count++;
else if(c[i]==']'&&getc!='[') count++;
if(flag) break;
}
else
{
flag=1;
break;
}
}
}
if (flag || s.size())
printf("Impossible\n");
else printf("%d\n",count);
return 0;
}
【收获与反思】
1.循环里不要多次调用产生同一效果的函数,不然会TLE爆掉。
2.STL栈的使用熟悉:
stack <char> c;
stack <数据类型> 栈的名称;
来自学长整理的一点资料补充,放在这里方便日后查看。
常用:if(!c.empty()); char getc=c.top() ; c.pop(); c.push();