第一题:括号匹配问题
合法的括号匹配序列被定义为:
1.空串“”是合法的括号序列;
2.如果X和Y是合法序列,那么XY一定是合法序列
3.如果X是合法序列,那么(X)也一定是合法序列
4.每个合法的库哦啊好序列都可由上面的规则生成。
东东现在有一个合法的括号序列S,一次移除操作分为两步:
1.移除序列最左边的一个左括号;
2.移除序列s中任意一个右括号。保证操作之后s还是一个合法的括号序列。
东东现在想知道使用上述的移除操作有多少种方法可以吧序列s变为空。
如果两个方案中又一次一处操作移除的是不同右括号,就认为是不同的方案。
比如说s="()()()"输处1.因为只有一种可能。
而s="(((())))"输处24,第一次有4中情况,第二次有3种情况,一次类推,有4*3*2*1=24种情况。
这个问题,只需要维护一个变量tmp,然后遇到(就加,遇到)就在现有基础上*tmp然后tmp--即可。
public static int process(String str){
int res = 1;
int tmp = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='(')
tmp++;
else{
res*=tmp;
tmp--;
}
}
return res;
}
第二题,我认为可以先把基础的数量计算进去,分别是N^2+2+3+...N。然后再看幂级数存在交叉的。
而且如果是2交叉到4,那么2^pow = 4,这时候有一个pow,那么pow是可以指数增长直到N的,并且只能是pow指数增长,4才可能有一个数幂和2^pow相同。
也就是有pow*pow...*pow<=n的时候,的pow个数。
同理,从2开始遍历检索,3,4,5,6但是这时候也存在一个问题,就是没有考虑到4,8的情况,因为4^pow!=8,所以可能还是存在问题。这个就看有没有别的大神想出来了。