题目链接
法一(分治法 + 备忘录)
private Map<String, List<Integer>> map = new HashMap<>();
private int operation(int a, int b, int c) {
if (c == '+') {
return a + b;
} else if (c == '-') {
return a - b;
} else {
return a * b;
}
}
public List<Integer> diffWaysToCompute(String expression) {
List<Integer> ans = new LinkedList<>();
if (expression.length() < 3) {
ans.add(Integer.parseInt(expression));
return ans;
}
if (map.containsKey(expression)) {
return map.get(expression);
}
for (int i = 1; i < expression.length() - 1; i++) {
char c = expression.charAt(i);
if (c < 48 || c > 57) {
List<Integer> left = diffWaysToCompute(expression.substring(0, i));
List<Integer> right = diffWaysToCompute(expression.substring(i + 1, expression.length()));
for (Integer a : left) {
for (Integer b : right) {
ans.add(operation(a, b, c));
}
}
}
}
map.put(expression, ans);
return ans;
}
本地测试
lay.showTitle(241);
Solution241 sol241 = new Solution241();
String expression241 = "2*3-4*5";
System.out.println(expression241);
System.out.println(sol241.diffWaysToCompute(expression241));