from:https://leetcode.com/submissions/detail/36926833/
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]
public class Solution {
Map<String, List<Integer>> subs;
public List<Integer> diffWaysToCompute(String input) {
if(null == input || "".equals(input)) return new ArrayList<Integer>();
List<Integer> nums = new ArrayList<Integer>();
List<Character> opts = new ArrayList<Character>();
subs = new HashMap<String, List<Integer>>();
// +:<0 -:=0 *>0
findOutNumsOpts(input, nums, opts);
return calculate(nums, opts);
}
private List<Integer> calculate(List<Integer> nums, List<Character> opts) {
return calculate(nums, opts, 0, nums.size()-1);
}
private List<Integer> calculate(List<Integer> nums, List<Character> opts, int st, int ed) {
List<Integer> anses = new ArrayList<Integer>();
if(st == ed) {
anses.add(nums.get(st));
return anses;
}
for(int i=st; i<ed; ++i) {
List<Integer> lefts = subs.get(st + "-" +i);
if(null == lefts) {
lefts = calculate(nums, opts, st, i);
subs.put(st + "-" +i, lefts);
}
List<Integer> rigts = subs.get((i+1) + "-" + ed);
if(null == rigts) {
rigts = calculate(nums, opts, i+1, ed);
subs.put((i+1) + "-" + ed, rigts);
}
for(Integer lv : lefts) {
for(Integer rv : rigts) {
switch(opts.get(i)) {
case '+' : {
anses.add(lv+rv);
break;
}
case '-' : {
anses.add(lv-rv);
break;
}
case '*' : {
anses.add(lv*rv);
break;
}
}
}
}
}
return anses;
}
private void findOutNumsOpts(String s, List<Integer> nums, List<Character> opts) {
for(int i=0, n=s.length(); i<n; ++i) {
char c = s.charAt(i);
if('+' == c) {
opts.add('+');
} else if('-' == c){
opts.add('-');
} else if('*' == c) {
opts.add('*');
} else if('0'<=c && '9'>=c) {
int u = 0;
while(i<n && '0'<=c && '9'>=c) {
u = u*10 + c-'0';
++i;
if(i < n) c = s.charAt(i);
}
nums.add(u);
--i;
}
}
}
}
public class Solution {
public List<Integer> diffWaysToCompute(String input) {
if(null == input || "".equals(input)) return new ArrayList<Integer>();
List<Integer> nums = new ArrayList<Integer>();
List<Character> opts = new ArrayList<Character>();
// +:<0 -:=0 *>0
findOutNumsOpts(input, nums, opts);
return calculate(nums, opts);
}
private List<Integer> calculate(List<Integer> nums, List<Character> opts) {
return calculate(nums, opts, 0, nums.size()-1);
}
private List<Integer> calculate(List<Integer> nums, List<Character> opts, int st, int ed) {
List<Integer> anses = new ArrayList<Integer>();
if(st == ed) {
anses.add(nums.get(st));
return anses;
}
for(int i=st; i<ed; ++i) {
List<Integer> lefts = calculate(nums, opts, st, i);
List<Integer> rigts = calculate(nums, opts, i+1, ed);
for(Integer lv : lefts) {
for(Integer rv : rigts) {
switch(opts.get(i)) {
case '+' : {
anses.add(lv+rv);
break;
}
case '-' : {
anses.add(lv-rv);
break;
}
case '*' : {
anses.add(lv*rv);
break;
}
}
}
}
}
return anses;
}
private void findOutNumsOpts(String s, List<Integer> nums, List<Character> opts) {
for(int i=0, n=s.length(); i<n; ++i) {
char c = s.charAt(i);
if('+' == c) {
opts.add('+');
} else if('-' == c){
opts.add('-');
} else if('*' == c) {
opts.add('*');
} else if('0'<=c && '9'>=c) {
int u = 0;
while(i<n && '0'<=c && '9'>=c) {
u = u*10 + c-'0';
++i;
if(i < n) c = s.charAt(i);
}
nums.add(u);
--i;
}
}
}
}