题目链接:http://codeforces.com/problemset/problem/612/C
题意:有4对类型的括号,可以将左括号变成另一类型的左括号,可以将右括号变成另一类型的右括号,问最少变多少次可以括号可以匹配,不可以输出-1
思路:利用栈做括号匹配就可以了,失配的时候将一个右括号转换下类型res++,最后栈清空了就匹配完成
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
stack <char>stk;
char s[1000030];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
while (!stk.empty())
stk.pop();
scanf("%s",&s);
int len=strlen(s),res=0,flag=1;
for (int i=0;i<len;i++)
{
if (s[i]=='(' || s[i]=='{' || s[i]=='<' || s[i]=='[')
stk.push(s[i]);
else if (s[i]==')')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='(') res++;
}
else
{
flag=0;
}
}
else if (s[i]=='}')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='{') res++;
}
else
{
flag=0;
}
}
else if (s[i]==']')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='[') res++;
}
else
{
flag=0;
}
}
else if (s[i]=='>')
{
if (stk.size()!=0)
{
char tmp=stk.top();
stk.pop();
if (tmp!='<') res++;
}
else
{
flag=0;
}
}
}
if (flag && stk.size()==0)
printf("%d\n",res);
else
printf("Impossible");
}
}
本文介绍了一个括号匹配问题的解决方法,通过使用栈来处理四种不同类型的括号,并允许括号类型之间的转换。该算法能够计算出使所有括号正确配对所需的最小转换次数。
1080

被折叠的 条评论
为什么被折叠?



