LeetCode 241 为运算表达式设计优先级
问题描述:
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
分治
- 任何一个完整的运算式(单目运算除外)都可以从运算符位置分成两个子运算式
- 因此一个运算式加括号后的可能值等于在所有可能的符号位置拆分后得到的子运算式的运算结果集合
- 子运算式的计算相互间独立,其结果集合同样以递归的形式使用上述方式得到
- 分治与动态规划的区别:
- 动态规划的问题与子问题之间是逐级嵌套的关系(初始问题 < 子问题1 < 子问题2 < ... < 原问题)
- 分治的问题与子问题之间也是包含关系,但同级别子问题之间相互独立
(初始问题1<子问题11, 初始问题2<子问题12)< 子问题21, ...
执行用时:2 ms, 在所有 Java 提交中击败了79.70%的用户
内存消耗:40.1 MB, 在所有 Java 提交中击败了10.98%的用户
class Solution {
public List<Integer> diffWaysToCompute(String input) {
List<Integer> ways = new ArrayList<>();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '+' || c == '-' || c == '*') {
List<Integer> left = diffWaysToCompute(input.substring(0, i));
List<Integer> right = diffWaysToCompute(input.substring(i + 1));
for (int l : left) {
for (int r : right) {
switch (c) {
case '+':
ways.add(l + r);
break;
case '-':
ways.add(l - r);
break;
case '*':
ways.add(l * r);
break;
}
}
}
}
}
if (ways.size() == 0) {
ways.add(Integer.valueOf(input));
}
return ways;
}
}