题目
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
class Solution {
HashMap<String,List<Integer>> memo=new HashMap<>();;//记忆
public List<Integer> diffWaysToCompute(String input) {
if (memo.containsKey(input)){
return memo.get(input);
}
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < input.length(); i++) {
char c= input.charAt(i); // 扫描算式 input 中的运算符
if (c=='-'||c=='*'||c=='+'){
/****** 分 ******/
// 以运算符为中心,分割成两个字符串,分别递归计算
List<Integer> left=diffWaysToCompute(input.substring(0,i));
List<Integer> right=diffWaysToCompute(input.substring(i+1));//只有一个参数是返回i+1之后全部
/****** 治 ******/
// 通过子问题的结果,合成原问题的结果,二重循环遍历所有可能
for (int a:left
) {
for (int b:right
) {
if (c=='+') res.add(a+b);
else if (c=='-') res.add(a-b);
else res.add(a*b);
}
}
}
}
// base case
// 如果 res 为空,说明算式是一个数字,没有运算符
if (res.isEmpty()){
res.add(Integer.parseInt(input));
}
memo.put(input, res);//加入备忘录
return res;
}
}
要点
- 本题使用分治法,对每一个运算符进行分割,直到input没有运算符后开始运算(治)
- 由于本题重复的可能也包含,所以不用排除重复的
- 分治法的要点在如何分,最后考虑怎么治