【分治思想】241. 为运算表达式设计优先级

用运算符作为分割,对两边的表达式进行求值,分而治之;

class Solution {
public:
    int calc(int left, int right, char op){
        switch (op){
            case '+':
                return left + right;
            case '-':
                return left - right;
            case '*':
                return left * right;
        }
        return 0;
    }

    vector<int> diffWaysToCompute(string expression) {
        int expr_len = expression.size();
        vector<int> result;
        bool flag = false;
        for(int i=0;i<expr_len;++i)
            if (expression[i] < '0' || expression[i] > '9'){
                flag = true;
                auto left = diffWaysToCompute(expression.substr(0, i));
                auto right = diffWaysToCompute(expression.substr(i+1, expr_len-i-1));
                for(auto l : left)
                    for(auto r: right)
                        result.push_back(calc(l,r,expression[i]));
            }
        if(!flag)
            result.push_back(atoi(expression.c_str()));
        return result;
    }
private:
};

带记录进行优化,剪枝:(其实就是加个map)

class Solution {
public:
    int calc(int left, int right, char op){
        switch (op){
            case '+':
                return left + right;
            case '-':
                return left - right;
            case '*':
                return left * right;
        }
        return 0;
    }

    vector<int> diffWaysToCompute(string expression) {
        if(record.find(expression) != record.end()){
            return record[expression];
        }
        int expr_len = expression.size();
        vector<int> result;
        bool flag = false;
        for(int i=0;i<expr_len;++i)
            if (expression[i] < '0' || expression[i] > '9'){
                flag = true;
                string left_str = expression.substr(0, i);
                string right_str = expression.substr(i+1, expr_len-i-1);
                auto left = diffWaysToCompute(left_str);
                record[left_str] = left;
                auto right = diffWaysToCompute(right_str);
                record[right_str] = right;
                for(auto l : left)
                    for(auto r: right)
                        result.push_back(calc(l,r,expression[i]));
            }
        if(!flag)
            result.push_back(atoi(expression.c_str()));
        return result;
    }
private:
    map<string, vector<int>> record;
};
posted @ 2022-03-01 11:59  fwx  阅读(27)  评论(0)    收藏  举报