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

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

1.题目描述

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例 1:
241. 为运算表达式设计优先级_第1张图片
示例 2:
241. 为运算表达式设计优先级_第2张图片

2.思路(分治法)

进行分治算法三步走:
1.分解:按运算符分成左右两部分,分别求解
2.解决:实现一个递归函数,输入算式,返回算式解
3.合并:根据运算符合并左右两部分的解,得出最终解

3.代码

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
        vector<int> res;
        for(int i = 0;i < input.size();++i){
            char c = input[i];
            if(c == '+' || c == '-' || c == '*'){
                vector<int> left = diffWaysToCompute(input.substr(0,i));
                vector<int> right = diffWaysToCompute(input.substr(i+1));
                for(auto l : left){
                    for(auto r : right){
                       if(c == '+'){
                           res.emplace_back(l+r);
                       }
                       else if(c == '-'){
                           res.emplace_back(l-r);
                       }
                       else{
                           res.emplace_back(l*r);
                       }
                    }
                }
            }
        }
        if(res.empty()){//如果字符串中没有符号,没有数字
            res.push_back(stoi(input));
        }
        return res;
    }
};

4.复杂度分析

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

你可能感兴趣的:(解题思想-分治法)