Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +
, -
and *
.
Example 1
Input: "2-1-1"
.
((2-1)-1) = 0 (2-(1-1)) = 2
Output: [0, 2]
Example 2
Input: "2*3-4*5"
(2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
Output: [-34, -14, -10, -10, 10]
Solution:
It is hard to solve it iteratively, using recursion would be simpler, for each of the operation just compute all the possible answers on the left and right and combine them together.
Code:
public class Solution {
public List<Integer> diffWaysToCompute(String input) {
List<String> strs = convert(input);
HashMap<Integer,List<Integer>> hm = new HashMap();
return helper(strs,0,strs.size() - 1,hm);
}
public List<Integer> helper(List<String> strs, int from, int to, HashMap<Integer,List<Integer>> hm){
int key = from * strs.size() + to;
if(hm.containsKey(key)){
return hm.get(key);
}
List<Integer> l = new ArrayList<Integer>();
if(from == to){
l.add(Integer.parseInt(strs.get(from)));
hm.put(key,l);
return l;
}
for(int i = from + 1; i < to; i+=2){
List<Integer> i1 = helper(strs,from,i-1,hm);
List<Integer> i2 = helper(strs,i + 1, to,hm);
if(strs.get(i).equals("+")){
for(int j1 : i1){
for(int j2 : i2){
l.add(j1 + j2);
}
}
} else if(strs.get(i).equals("-")){
for(int j1 : i1){
for(int j2 : i2){
l.add(j1 - j2);
}
}
} else {
for(int j1 : i1){
for(int j2 : i2){
l.add(j1 * j2);
}
}
}
}
hm.put(key,l);
return l;
}
public List<String> convert(String s){
List<String> ret = new ArrayList<>();
int num = 0;
for(char c : s.toCharArray()){
if(Character.isDigit(c)){
num = num * 10 + c - '0';
} else {
ret.add("" + num);
ret.add("" + c);
num = 0;
}
}
ret.add("" + num);
return ret;
}
}