算出有几种括号的放法可使该表达式得出result值

/*** 攻略:给定一个布尔表达式,由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;}

方法二:

//动态规划/** * 思路:缓存不同表达式的结果,避免多次用到同一个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;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

往事是尘封在记忆中的梦,而你是我唯一鲜明的记忆,

算出有几种括号的放法可使该表达式得出result值

相关文章:

你感兴趣的文章:

标签云: