一、Description
题目描述:给一个字符串,任意加括号,输出所有可能的取值。
Example 1:
Input:"2-1-1"
Output:[0, 2]
Explanation: ((2-1)-1) = 0 (2-(1-1)) = 2
Example 2:
Input:"2*3-4*5"
Output:[-34, -14, -10, -10, 10]
Explanation: (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
二、Analyzation
每次遇到一个操作符,就通过递归找到左边和右边的字符串对应的list,然后循环遍历排列组合,add到list中。通过一个map可减少递归调用的时间。
三、Accepted code
class Solution {
Map<String, List<Integer>> map = new HashMap<>();
public List<Integer> diffWaysToCompute(String input) {
List<Integer> list = new ArrayList<>();
if (null == input || 0 == input.length()) {
return list;
}
if (map.containsKey(input)) {
return map.get(input);
}
boolean flag = true;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '+' || c == '-' || c == '*') {
flag = false;
List<Integer> left = diffWaysToCompute(input.substring(0, i));
List<Integer> right = diffWaysToCompute(input.substring(i + 1, input.length()));
for (int l : left) {
for (int r : right) {
if (c == '+') {
list.add(l + r);
} else if (c == '-') {
list.add(l - r);
} else {
list.add(l * r);
}
}
}
}
}
if (flag) {
list.add(Integer.valueOf(input));
}
map.put(input, list);
return list;
}
}