/**
* 攻略:給定一個布爾表達式,由0、一、&、|和^等符號組成,以及一個想要的布爾結果result,實現一個函數,算出有幾種括號的放法可以使該表達式
* 得出result值。java
*/express
兩種方法:緩存
方法一:app
- /**
- * 思路:迭代整個表達式,將每一個運算符看成第一個要加括號的運算符。
- * @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 copyspa
- //動態規劃
- /**
- * 思路:緩存不一樣表達式的結果,避免屢次用到同一個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;
-
- }