返回
Python 轻松搞定 leetcode 2232:给表达式加括号以最小化结果
后端
2023-12-06 05:47:12
题目理解
给你一个字符串 s
,其中包含数字和运算符 +
和 *
。你可以向 s
中添加任意数量的括号以改变其运算顺序。
你希望得到一个能够使表达式 s
的计算结果最小的结果。请你返回最小的结果。
暴力解法
这道题的暴力解法非常简单,我们可以使用一个递归函数来枚举所有可能的括号组合,然后计算每个组合的计算结果,最后返回最小的计算结果。
def min_result(s):
# 计算字符串 s 的值
def eval_expr(s):
tokens = s.split()
stack = []
for token in tokens:
if token == '+' or token == '*':
stack.append(token)
else:
op2 = stack.pop()
op1 = stack.pop()
op = stack.pop()
if op == '+':
stack.append(int(op1) + int(op2))
else:
stack.append(int(op1) * int(op2))
return stack[0]
# 暴力枚举所有可能的括号组合
def generate_括号(s):
if len(s) == 0:
return [""]
result = []
for i in range(1, len(s), 2):
if s[i] == '+' or s[i] == '*':
left_括号s = generate_括号(s[:i])
right_括号s = generate_括号(s[i+1:])
for left_括号 in left_括号s:
for right_括号 in right_括号s:
result.append("({}){}".format(left_括号, s[i] + right_括号))
return result
# 计算所有可能的括号组合的计算结果,并返回最小的计算结果
min_result = float('inf')
for expr in generate_括号(s):
min_result = min(min_result, eval_expr(expr))
return min_result
# 测试
s = "1+2*3+4*5"
print(min_result(s)) # 20
结语
这道题其实主要考察的就是对题目的理解,使用暴力解法即可解决。希望这篇教程对你有所帮助!