【Leetcode】Different Ways to Add Parentheses

题目链接:

题目:

Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are+- and *.


Example 1

Input: "2-1-1".

((2-1)-1) = 0
(2-(1-1)) = 2

Output: [0, 2]


Example 2

Input: "2*3-4*5"

(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

Output: [-34, -14, -10, -10, 10]

思路:

从左到右开始遍历,遇到运算符 则将该运算符视为表达式的中心(left op right),表达式分成左右两部分,分别递归计算左右部分,并将结果和该运算符进行相应计算,本次计算相当于在该运算符两边加了个括号(left op right)。        将表达式中每个运算符都做一次如上操作,则得到所有可能情况下的结果值。为了优化时间,可以用一个hashmap保存已经计算过的情况。

算法

Map<String, List<Integer>> maps = new HashMap<String, List<Integer>>();  
  
public List<Integer> diffWaysToCompute(String input) {  
    List<Integer> results = new ArrayList<Integer>();  
    for (int i = 0; i < input.length(); i++) {  
        char t = input.charAt(i);  
        if (t == '+' || t == '-' || t == '*') {  
            String sleft = input.substring(0, i);  
            String sright = input.substring(i + 1);  
            List<Integer> left, right;  
  
            if (maps.containsKey(sleft)) {  
                left = maps.get(sleft);  
            } else {  
                left = diffWaysToCompute(input.substring(0, i));// 左右边所有可能的计算结果  
            }  
  
            if (maps.containsKey(sright)) {  
                right = maps.get(sright);  
            } else {  
                right = diffWaysToCompute(input.substring(i + 1));  
            }  
  
            for (int l : left) {  
                for (int r : right) {  
                    int res = 0;  
                    switch (t) {  
                    case '+':  
                        res = l + r;  
                        break;  
                    case '-':  
                        res = l - r;  
                        break;  
                    case '*':  
                        res = l * r;  
                        break;  
                    }  
                    results.add(res);  
                }  
            }  
        }  
    }  
    if (results.size() == 0) { // 当input为数字时  
        results.add(Integer.parseInt(input));  
    }  
    return results;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值