贪心
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=2005;
char s[maxn];
int main()
{
int cas=1;
while(scanf("%s",s)&&s[0]!='-')
{
int left=0,ans=0;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='{')
left++;
else if(left)//右括号,抵消一个前面的左括号
left--;
else//开始就是右括号,变为左
{
ans++;
left++;
}
}
printf("%d. %d\n",cas++,ans+left/2);
}
return 0;
}
用栈实现
#include <iostream>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=2005;
char s[maxn];
stack<char> ms;
int main()
{
int cas=1;
while(scanf("%s",s)&&s[0]!='-')
{
int ans=0;
while(!ms.empty())
ms.pop();
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(ms.empty())
{
ms.push('{');
if(s[i]=='}')
ans++;
}
else
{
if(s[i]=='{')
ms.push('{');
else
ms.pop();
}
}
if(!ms.empty())
ans+=ms.size()/2;
printf("%d. %d\n",cas++,ans);
}
return 0;
}