You’re given a non empty string made in its entirety from opening and closing braces. Your task is to find the minimum number of “operations” needed to make the string stable. The definition for being stable is as follows:
- An empty string is stable.
- If S is stable, then {S} is also stable.
- If S and T are both stable, then ST (the concatenation of the two) is also stable.
All of these strings are stable: {}, {}{}, and {{}{}}; But none of these: }{, {{}{, nor {}{.
The only operation allowed on the string is to replace an opening brace with a closing brace, or visa-versa.
Input
The last line of the input is made of one or more ’-’ (minus signs.)
Output
k. N
Where k is the test case number (starting at one,) and N is the minimum number of operations needed to convert the given string into a balanced one.
Sample Input
}{ {}{}{} {{{} ---
Sample Output
1. 2 2. 0 3. 1
这题的思想比较简单,但是可能会想不到,就是对于每一组括号,总是先出现左括号,后出现右括号,每一组左括号都对应一个右括号。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 4400
char ch[maxn];
int num,no[maxn],n;
void solve(){
num=0;
int d=0;
for(int i=0;i<n;i++){
if(no[i]==0) d++;
if(no[i]==1) d--;
if(d<0){
no[i]=0;
num++;
d=1;
}
}
if(d>0) num+=d/2;
}
int main(){
int counnt=0;
while(scanf("%s",&ch)!=EOF){
if(ch[0]=='-') break;//只要是存在‘-’,即可作为结束条件
num=0;
int i;
for(i=0;i<strlen(ch);i++){
if(ch[i]=='{') no[i]=0;
else no[i]=1;
}
n=i;
solve();
printf("%d. %d\n",++counnt,num);
}
return 0;
}