/*
假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。
给定一个整数n,请返回所求的合法排列数。保证结果在int范围内。
*/
public class Parenthesis {
/*
使用卡特兰公式:(2*n)!除以n!*n!,再除以(n+1)
注意数的范围,和该公式可以抵消一些数
*/
public int countLegalWays(int n) {
int s1=factorial(2*n,n);
int s2=factorial(n,1);
int stemp=s2*(n+1);
int result=0;
if(s1%stemp==0){
result=s1/stemp;
}else{
result=s1/stemp;
result+=1;
}
return result;
}
//求阶乘n的阶乘
public int factorial(int n,int m){
int result=1;
for(int i=n;i>m;i--){
result*=i;
}
return result;
}
}