Leetcode 241. 为运算表达式设计优先级 (递归分治)

这篇博客介绍了如何用优雅的Python和C++代码解决计算表达式的不同方式。通过递归地处理运算符,将表达式拆分成左右子问题并合并结果。在Python中,可以直接处理字符串,而在C++中需要额外处理多位数字的解析。这种方法展示了如何处理加法、减法和乘法运算符。
摘要由CSDN通过智能技术生成

由于输出的表达式一定是合法的,且没有多余的字符串,因此我们对于任意一个运算符,可以分将这个运算符拆成左右两个运算符,递归解决左右两个子问题。解决完以后,然后合并成答案。

这里有两种方法,一种先做一个parse,将多位数字提前解析好,另一种不需要解析,直接对字符串进行处理,这种情况下Python实现起来更优雅。

优雅的Python代码

class Solution:
    def diffWaysToCompute(self, expression: str) -> List[int]:
        op = ['*', '+', '-']
        if expression.isdigit():
            return [int(expression)]
        res = []
        for i, c in  enumerate(expression):
            if c in op:
                left = self.diffWaysToCompute(expression[:i])
                right = self.diffWaysToCompute(expression[i+1:])
                for l in left:
                    for r in right:
                        if c == '*':
                            res.append(l * r)
                        elif c == '+':
                            res.append(l + r)
                        elif c == '-':
                            res.append(l - r)
        return res

 下面是C++代码,由于C++ string不容易直接isdigit,因此需要这样写

class Solution {
public:
    vector<int> diffWaysToCompute(string expression) {
        vector<int> res;
        for(int i = 0; i < expression.size(); i++) {
            char c = expression[i];
            if (c == '*' || c == '-' || c == '+') {
                auto l = diffWaysToCompute(expression.substr(0, i));
                auto r = diffWaysToCompute(expression.substr(i + 1));
                for (auto v1 : l) {
                    for(auto v2 : r) {
                        switch(c) {
                            case '+' : res.push_back(v1 + v2); break;
                            case '-' : res.push_back(v1 - v2); break;
                            case '*' : res.push_back(v1 * v2); break;
                        }
                    }
                }
            }
        }
        if(res.size() == 0) {
            res.push_back(stoi(expression));
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值