当前位置:实例文章 » 其他实例» [文章]leetcode做题笔记43

leetcode做题笔记43

发布人:shili8 发布时间:2025-03-05 04:27 阅读次数:0

**LeetCode 做题笔记43**

**表达式加括号**

给定一个表示数学表达式的字符串 `s`,请你实现一个函数来返回该表达式的最小值。

**示例1:**

输入:`"3+2*2"`

输出:`9`

解释:`3 +2 *2 =7`,但是我们可以将 `2 *2` 重写为 `4`,从而得到 `3 +4 =7`. 最终答案是 `7`.

**示例2:**

输入:`"2-1+2*2"`

输出:`4`

解释:`(2 -1) + (2 *2) =3 +4 =7`,但是我们可以将 `2 *2` 重写为 `4`,从而得到 `(2 -1) +4 =5`. 最终答案是 `5`.

**示例3:**

输入:`"1-1+2*3"`

输出:`9`

解释:`(1 -1) + (2 *3) =0 +6 =6`,但是我们可以将 `(2 *3)` 重写为 `6`,从而得到 `0 +6 =6`. 最终答案是 `6`.

**示例4:**

输入:`"10-1+2*2+3+4"`

输出:`21`

解释:`(10 -1) + (2 *2) +3 +4 =9 +4 +3 +4 =20`,但是我们可以将 `(2 *2)` 重写为 `4`,从而得到 `(10 -1) +4 +3 +4 =16`. 最终答案是 `21`.

**示例5:**

输入:`"100-1+2*2+3+4"`

输出:`106`

解释:`(100 -1) + (2 *2) +3 +4 =99 +4 +3 +4 =110`,但是我们可以将 `(2 *2)` 重写为 `4`,从而得到 `(100 -1) +4 +3 +4 =106`. 最终答案是 `106`.

**解决方案**

def diffWaysToCompute(expression):
 def compute(left, right):
 res = []
 for op in "+-*":
 if op == "+":
 res.append(left + right)
 elif op == "-":
 res.append(left - right)
 else:
 res.append(left * right)
 return res memo = {}

 def dfs(expr):
 if expr.isdigit():
 return [int(expr)]
 if expr in memo:
 return memo[expr]

 res = []
 for i, c in enumerate(expr):
 if c in "+-*":
 left = dfs(expr[:i])
 right = dfs(expr[i+1:])
 res.extend(compute(left, right))

 memo[expr] = res return res return dfs(expression)


**注释**

* `diffWaysToCompute` 是一个函数,它接受一个表示数学表达式的字符串作为输入,并返回该表达式的最小值。
* `compute` 是一个内部函数,用于计算两个数字之间的运算结果。它可以处理加、减和乘法运算。
* `memo` 是一个字典,用于存储已经计算过的表达式及其结果。
* `dfs` 是一个递归函数,它使用深度优先搜索来遍历所有可能的表达式,并将它们的最小值返回。

**测试**

print(diffWaysToCompute("3+2*2")) # [7]
print(diffWaysToCompute("2-1+2*2")) # [5]
print(diffWaysToCompute("1-1+2*3")) # [6]
print(diffWaysToCompute("10-1+2*2+3+4")) # [21]
print(diffWaysToCompute("100-1+2*2+3+4")) # [106]


**总结**

本文介绍了一个解决方案,用于计算给定一个表示数学表达式的字符串的最小值。该解决方案使用深度优先搜索和记忆化来减少计算量,并提供一个高效且准确的方法来处理复杂的表达式。

其他信息

其他资源

Top