LeetcodeDifferent Ways to Add Parentheses

Posted wuezs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetcodeDifferent 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;  
}  


以上是关于LeetcodeDifferent Ways to Add Parentheses的主要内容,如果未能解决你的问题,请参考以下文章

241. Different Ways to Add Parentheses

5 Ways to Learn and Remember Absolutely Anything

Different Ways to Add Parentheses

LeetCode:Different Ways to Add Parentheses

[LeetCode] Different Ways to Add Parentheses

241. Different Ways to Add Parentheses