题目描述
合法的括号匹配序列被定义为
1 空串“”是合法的括号序列
2如果“X”和“Y”是合法的序列,那么“XY”也是一个合法的括号序列
3如果“X”是一个合法的序列,那么“(X)”也是一个合法的括号序列
4每个合法的括号序列都可以由上面的规则生成
例如“”,“()”,“()()()”,“(()())”,“(((())))”都是合法的。东东现在有一个合法的括号序列s,一次移除操作分为两步
1移除序列s中第一个左括号
2移除序列s中任意一个右括号,保证操作之后s还是一个合法的括号序列
东东现在想知道使用上述的移除操作有多少种方案可以把序列s变为空
如果两个方案中有一次移除操作移除的是不同的右括号就认为是不同的方案
例如 s="(((())))"输出24,第一次有4种情况,第二次有三种情况,依次类推有4*3*3*1=24
输入描述
输入包括一行,一行合法的括号序列s,序列长度length(2<=length<=20)
输出一个整数表示方案数
示例1
输入
(((())))
输出
24
#include<stdio.h>
#include<string.h>
using namespace std;
bool judge( char str2[]){
char hel[20];
int coul=0; ///当作左边栈
char her[20];
int length2=strlen(str2);
int i=0;
while(i<length2){
if(str2[i]=='('){
hel[coul++]='(';
}else if(str2[i]==')'){
if(coul==0)
return false;
else coul--;
}
i++;
}
if(coul!=0) return false;
return true;
}
int main(){
char str[20];
while(scanf("%s",str)!=EOF){
if(judge(str)==false)
printf("0\n");
else{
int length=strlen(str);
int ans=1;
int poi=-1;
for(int i=0;i<length;i++){
int count=0;
str[i]='a';
for(int j=i+1;j<length;j++){
if(str[j]==')'){
str[j]='a';
if(judge(str)==true){
count++;
poi=j;
}
str[j]=')';
}
}
str[poi]='a';
if(count!=0)
ans=ans*count;
}
printf("%d\n",ans);
}
}
return 0;
}