题目
给定一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种组成的字符串express,再给定一个布尔值desired。返回express能有多少种组合方式。可以达到desired的结果。
举例
express“1^0|0|1”,desired=false.
只有1^((0|0)|1)和1^(0|(0|1))的组合可以得到false,返回2.
express=“1”,desired=false
无组合则可以得到false,返回0。
表达式得长度必须是奇数
表达式下标为偶数位置的字符一定是'0'或'1'。
表达式下标为奇数位置的字符一定是'&'或‘|’或‘^’
public boolean isValid(char[] exp){
if((exp.length & 1) == 0){
return false;
}
for(int i = 0;i<exp.length;i = i + 2){
int((exp[i] != '1') && (exp[i] != '0')){
return false;
}
}
for(int i = 1;i<exp.length;i = i + 2){
int((exp[i] != '&') && (exp[i] != '|') && (exp[i] != '^') ){
return false;
}
}
return true;
}
public int num1(String express,boolean desired){
if(express == null || express.equals("")){
return 0;
}
char[] exp = express.toCharArray();
if(!isValid(exp)){
return 0;
}
return p(exp,desitred,0,exp.length -1);
}
public int p(char[] exp,boolean desired,int l,int r){
if( l == r){
if(exp[l] == '1'){
return desired ? 1 : 0;
}else{
return desired ? 0 : 1;
}
}
int res = 0;
if(desired){
for(int i = l + 1;i < r; i += 2){
switch(exp[i]){
case '&':
res += p(exp,true,l,i-1) * p(exp,true,i+1,r);
break;
case '|':
res += p(exp,true,l,i-1) * p(exp,false,i+1,r);
res += p(exp,false,l,i-1) * p(exp,true,i+1,r);
res += p(exp,true,l,i-1) * p(exp,true,i+1,r);
break;
case '^':
res += p(exp,true,l,i-1) * p(exp,false,i+1,r);
res += p(exp,false,l,i-1) * p(exp,true,i+1,r);
break;
}
}
}else{
for(int i = l + 1;i < r; i += 2){
switch(exp[i]){
case '&':
res += p(exp,false,l,i-1) * p(exp,true,i+1,r);
res += p(exp,true,l,i-1) * p(exp,false,i+1,r);
res += p(exp,false,l,i-1) * p(exp,false,i+1,r);
break;
case '|':
res += p(exp,false,l,i-1) * p(exp,false,i+1,r);
break;
case '^':
res += p(exp,true,l,i-1) * p(exp,true,i+1,r);
res += p(exp,false,l,i-1) * p(exp,false,i+1,r);
break;
}
}
}
return res;
}