| 7 | //tc: o(N*2^N) |
| 8 | //sc: o(N^2*2^N) |
| 9 | public List<Integer> recur(String exp, int start, int end,List<Integer>[][] dp){ |
| 10 | List<Integer> res = new ArrayList<>(); |
| 11 | if(dp[start][end]!=null){ |
| 12 | return dp[start][end]; |
| 13 | } |
| 14 | //base case : single digit |
| 15 | if(start==end){ |
| 16 | int num = exp.charAt(start)-'0'; |
| 17 | res.add(num); |
| 18 | return res; |
| 19 | } |
| 20 | //base case : double digit |
| 21 | if(end-start==1 && Character.isDigit(exp.charAt(start))){ |
| 22 | int num1 = exp.charAt(start)-'0'; |
| 23 | int num2 = exp.charAt(end)-'0'; |
| 24 | // int num = Integer.parseInt(exp.substring(start,end+1)); |
| 25 | res.add(num1*10 + num2); |
| 26 | return res; |
| 27 | } |
| 28 | //split |
| 29 | // N |
| 30 | for(int i=start;i<=end;i++){ |
| 31 | if(Character.isDigit(exp.charAt(i))){ |
| 32 | continue; |
| 33 | } |
| 34 | char op = exp.charAt(i); |
| 35 | // 2^N |
| 36 | List<Integer> left = recur(exp,start,i-1,dp); |
| 37 | List<Integer> right = recur(exp,i+1,end,dp); |
| 38 | for(int l : left){ |
| 39 | for(int r : right){ |
| 40 | if(op == '*'){ |
| 41 | res.add(l*r); |
| 42 | }else if(op == '+'){ |
| 43 | res.add(l+r); |
| 44 | }else{ |
| 45 | res.add(l-r); |
| 46 | } |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | dp[start][end] = res; |
| 51 | return res; |
| 52 | } |
| 53 | } |