241. 为运算表达式设计优先级

题目:

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

示例:

image.png

思路:

分治法:
遍历字符串,以运算符作为划分值,将依次计算 运算符 左右两边的值;
一旦遇到运算符,进入划分,直到左、右子字符串是一个数字,例如:划分至 2 - 3
计算完以后,将结果存放到返回的数组里。

代码:

class Solution {
    public List diffWaysToCompute(String input) {
        //创建一个新list集合,存储运算后的值
        List ways = new ArrayList<>();
        //遍历字符串
        for (int i = 0;i < input.length(); i++) {
            char sp = input.charAt(i);
            //如果遍历到运算符
            if (sp == '+' || sp =='-' || sp == '*') {
                //进行划分
                //计算运算符左边的值
                List left = diffWaysToCompute(input.substring(0, i));
                //计算运算符右边的值
                List right = diffWaysToCompute(input.substring(i + 1));
                for (int l : left) {
                    for (int r : right) {
                        switch(sp) {
                            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;
    }
}

时间复杂度:O(nlogn),空间复杂度:O(n)

你可能感兴趣的:(241. 为运算表达式设计优先级)