CodeForces-612C [C - Replace To Make Regular Bracket Sequence](栈 括号配对)
- 题目链接
- 题目大意:输入一个字符串s只包括四种括号,括号方向相同的如’[‘,’{‘,’(‘,’<’可以互换,同理’]’,’}’,’)’,’>’可以互换,如果方向不同不能互换,判断给出的字符串s能否变成RBS串(就是经过变换都能两两配对成功),如果能则输出需要改变的最少次数
- 解题思路:刚开始我是用数组做的,直接扫一遍把相邻的一对括号判断出来,把其他字符存到另一个数组,然后再在这数组里看看两两相邻的是不是一对,但是这种解法是不对的,比如字符串[[[]]],第一次后变成[[]],头两个相邻位置的字符,不是一对但是这种也是可以的,我错误的地方是没有想到经过一次筛除相邻位置成对的括号后得到的字符串,还是有可能大括号套小括号的,然后我就看了网上的题解,用了栈(先进后出),从头到尾扫一遍遇到’[‘,’{‘,’(‘,’<’全部放到栈里,遇到’]’,’}’,’)’,’>’就跟已经在栈里的对比
- AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=1000100;
char a[maxn];
int main()
{
int i,len,ans=0,flag=0;
stack<char> st;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='<'||a[i]=='{')
st.push(a[i]);
else if(a[i]==')'||a[i]=='}'||a[i]=='>'||a[i]==']')
{
if(st.empty())
{
flag=1;
break;
}
else
{
char t=st.top();
st.pop();
if((t=='('&&a[i]!=')')||(t=='['&&a[i]!=']')||(t=='{'&&a[i]!='}')||(t=='<'&&a[i]!='>'))
ans++;
}
}
}
if(flag==1||!st.empty())
printf("Impossible");
else
printf("%d",ans);
return 0;
}