返回

Python 轻松搞定 leetcode 2232:给表达式加括号以最小化结果

后端

题目理解

给你一个字符串 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

结语

这道题其实主要考察的就是对题目的理解,使用暴力解法即可解决。希望这篇教程对你有所帮助!