跳转至

分治法

分治法

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

方法1:分治、递归

对于一个形如 x op y(op 为运算符,x 和 y 为数) 的算式而言,它的结果组合取决于 x 和 y 的结果组合数,而 x 和 y 又可以写成形如 x op y 的算式。

因此,该问题的子问题就是 x op y 中的 x 和 y:以运算符分隔的左右两侧算式解。

class Solution {
public:
    vector<int> diffWaysToCompute(string expression) {
        int n = expression.length();
        vector<int> ways;
        for (int i = 0; i < n; ++i) {
            char c = expression[i];
            if (c == '+' || c == '-' || c == '*') {
                //1、分解:遇到运算符,计算左右两侧的结果集
                //2、解决:diffWaysTocompute递归函数求出子问题的解
                vector<int> left = diffWaysToCompute(expression.substr(0, i));
                vector<int> right = diffWaysToCompute(expression.substr(i + 1));
                //3、合并:根据运算符合并子问题的解
                for (int l : left) {
                    for (int r : right) {
                        switch (c) {
                        case '-':ways.push_back(l - r); break;
                        case '+':ways.push_back(l + r); break;
                        case '*':ways.push_back(l * r); break;
                        }
                    }
                }
            }

        }
        if (ways.empty()) {
            ways.push_back(stoi(expression));
        }
        return ways;
    }
};