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


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

题目描述

本题目来自LeetCode上的『241. 为运算表达式设计优先级』

给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。

生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过 10^4

示例1:

输入:expression = “23-45”
输出:[-34,-14,-10,-10,10]
解释
(2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10

提示
  • 1 <= expression.length <= 20
  • expression 由数字和算符 '+''-''*' 组成。
  • 输入表达式中的所有整数值在范围 [0, 99]

题解

不失一般性,以加法为例,对于表达式 $A + B$,将其以加号为分界,分成 $A$ 和 $B$ 两部分表达式,对于每一个表达式,再进行上述分治方法。
设递归函数 dfs(string str),如果 str 是一个数字,那么直接返回这个数字,否则将其根据运算符分成两部分进行递归。
数据量不大,可以爆搜,也可以使用记忆化递归。

代码

class Solution:
    def diffWaysToCompute(self, expression: str) -> List[int]:

        @cache
        def dfs(expression: str) -> List[int]:
            if expression.isdigit():
                return [int(expression)]
            ans = []
            for i, op in enumerate(expression):
                if op == '+' or op == '-' or op == '*':
                    l = dfs(expression[:i])
                    r = dfs(expression[i + 1:])
                    for item in itertools.product(l, r):
                        if op == '+':
                            ans.append(item[0] + item[1])
                        elif op == '-':
                            ans.append(item[0] - item[1])
                        elif op == '*':
                            ans.append(item[0] * item[1])
            return ans
        
        return dfs(expression)

复杂度分析

设第 $n$ 个卡特兰数为 $C_n$。

  • 时间复杂度:$O(C_n)$
  • 空间复杂度:$O(C_n)$

文章作者: xitie2000
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xitie2000 !
评论
  目录