提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例 1:
输入: “2-1-1”
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:
输入: “23-45”
输出: [-34, -14, -10, -10, 10]
解释:
(2*(3-(45))) = -34
((23)-(45)) = -14
((2(3-4))5) = -10
(2((3-4)5)) = -10
(((23)-4)*5) = 10
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
分治:子问题:遍历字符串,以运算符号作为分割符号将字符串分为两部分。返回值是不同情况的运算结果。
图中,(1)的乘号,对应左边分到2,右边是一个新的字符串,对于右边的这个串有两种返回值,因此(1)的结果可以有两种。以此类推,递归所有可能性就可以得出所有答案。
class Solution {
public List<Integer> diffWaysToCompute(String expression) {
List<Integer> list = new ArrayList<>();
List<Integer> leftRes = null;
List<Integer> rightRes = null;
for(int i = 0; i < expression.length(); i++){
char c = expression.charAt(i);
if(c == '+' || c == '-' || c == '*'){
leftRes = diffWaysToCompute(expression.substring(0, i));//[0, i - 1]
rightRes = diffWaysToCompute(expression.substring(i + 1));//[i + 1, expression.length() - 1]
for(Integer left : leftRes){
for(Integer right : rightRes){
switch(c){
case '+': list.add(left + right); break;
case '-': list.add(left - right); break;
case '*': list.add(left * right); break;
}
}
}
}
}
if(list.isEmpty()){//如果列表为空,表示没有进行运算,意味着到了第一个字符(左边没有了)或者最后一个字符(右边没有了)
list.add(Integer.parseInt(expression));
}
return list;
}
}