LeetCode/solutions/241. Different Ways to Add Parentheses.md
2019-10-20 15:23:01 +08:00

2.8 KiB

241. Different Ways to Add Parentheses

思路

给定一个可能含有加减乘的表达式,让我们在任意位置添加括号,求出所有可能表达式的不同值, 我们假设输入的表达式都是合法的.

由于每个括号内都是一个子表达式, 所以我们考虑用递归来做. 先考虑递归出口, 当表达式就是一个数, 那我们直接返回一个只包含这个数的数组就可以了. 再考虑一般情况, 我们可以从前往后遍历输入字符串, 每当遇到运算符我们就把这个位置作为切分点, 递归计算左右两个部分的结果, 然后将左右两个结果合并起来push进最终结果数组中.

我们还可以进一步改进: 用一个hashmap来缓存计算过的表达式的值, 这样如果下次再遇到就不用再次计算了.

C++

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
        if(input.empty()) return vector<int>();

        vector<int> res;
        for (int i = 1; i < input.size(); ++i) {
            // 从运算符分开分别递归计算两边
            if (input[i] == '+' || input[i] == '-' || input[i] == '*') {
                vector<int> left = diffWaysToCompute(input.substr(0, i));
                vector<int> right = diffWaysToCompute(input.substr(i + 1));
                for (int j: left) {
                    for (int k: right) {
                        if (input[i] == '+') res.push_back(j + k);
                        else if (input[i] == '-') res.push_back(j - k);
                        else res.push_back(j * k);
                    }
                }
            }
        }
        if (res.empty()) res.push_back(stoi(input));
        return res;
    }
};

hashmap改进

class Solution {
public:
    unordered_map<string, vector<int>> cache;
    vector<int> diffWaysToCompute(string input) {
        if(input.empty()) return vector<int>();
        if(cache.count(input)) return cache[input];
        vector<int> res;
        for (int i = 1; i < input.size(); ++i) {
            // 从运算符分开分别递归计算两边
            if (input[i] == '+' || input[i] == '-' || input[i] == '*') {
                vector<int> left = diffWaysToCompute(input.substr(0, i));
                vector<int> right = diffWaysToCompute(input.substr(i + 1));
                for (int j: left) {
                    for (int k: right) {
                        if (input[i] == '+') res.push_back(j + k);
                        else if (input[i] == '-') res.push_back(j - k);
                        else res.push_back(j * k);
                    }
                }
            }
        }
        if (res.empty()) res.push_back(stoi(input));
        cache[input] = res;
        return res;
    }
};