/**
* 攻略:给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式
* 得出result值。
*/
两种方法:
方法一:
- /**
- * 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符。
- * @param exp
- * @param result
- * @param s:start
- * @param e:end
- * @return
- */
- public static int f(String exp,boolean result,int s,int e){
- if(s==e){
- if(exp.charAt(s)=='1'&&result)
- return 1;
- if(exp.charAt(s)=='0'&&!result)
- return 1;
- return 0;
- }
- int c=0;
- if(result){
- for(int i=s+1;i<=e;i+=2){
- if(exp.charAt(i)=='&'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- }else if(exp.charAt(i)=='|'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='^'){
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- }
- }
- }else{
- for(int i=s+1;i<=e;i+=2){
- if(exp.charAt(i)=='&'){
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='|'){
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='^'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }
- }
- }
- return c;
- }
方法二:
[java] view plain copy
- //动态规划
- /**
- * 思路:缓存不同表达式的结果,避免多次用到同一个exp的值时需要重算。对expression和result进行缓存。
- * @param exp
- * @param result
- * @param s
- * @param e
- * @param map
- * @return
- */
- public static int ff(String exp,boolean result,int s,int e,HashMap<String,Integer> map){
- String key=""+result+s+e;//注意加""的位置,应加在前面,表示为字符串的拼接。否则,则表示值先相加,再转字符串
- if(map.containsKey(key))
- return map.get(key);
- int c=0;
- if(result){
- for(int i=s+1;i<=e;i+=2){
- if(exp.charAt(i)=='&'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- }else if(exp.charAt(i)=='|'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='^'){
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- }
- }
- }else{
- for(int i=s+1;i<=e;i+=2){
- if(exp.charAt(i)=='&'){
- c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='|'){
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }else if(exp.charAt(i)=='^'){
- c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
- c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
- }
- }
- }
- map.put(key, c);
- return c;
- }