向表达式添加括号后的最小结果
给你一个下标从 0 开始的字符串 expression ,格式为 "<num1>+<num2>" ,其中 <num1> 和 <num2> 表示正整数。
请你向 expression 中添加一对括号,使得在添加之后, expression 仍然是一个有效的数学表达式,并且计算后可以得到 最小 可能值。左括号 必须 添加在 '+' 的左侧,而右括号必须添加在 '+' 的右侧。
返回添加一对括号后形成的表达式 expression ,且满足 **expression **计算得到 最小 可能值 。 如果存在多个答案都能产生相同结果,返回任意一个答案。
生成的输入满足:expression 的原始值和添加满足要求的任一对括号之后 expression 的值,都符合 32-bit 带符号整数范围。
示例 1:
输入: expression = "247+38"
输出: "2(47+38)"
解释: 表达式计算得到 2 * (47 + 38) = 2 * 85 = 170 。
注意 "2(4)7+38" 不是有效的结果,因为右括号必须添加在 '+' 的右侧。
可以证明 170 是最小可能值。
示例 2:
输入: expression = "12+34"
输出: "1(2+3)4"
解释: 表达式计算得到 1 * (2 + 3) * 4 = 1 * 5 * 4 = 20 。
示例 3:
输入: expression = "999+999"
输出: "(999+999)"
解释: 表达式计算得到 999 + 999 = 1998 。
提示:
3 <= expression.length <= 10expression仅由数字'1'到'9'和'+'组成expression由数字开始和结束expression恰好仅含有一个'+'.expression的原始值和添加满足要求的任一对括号之后expression的值,都符合 32-bit 带符号整数范围
解题思路: 看起来两个数的位数都不多,所以直接暴力枚举所有方法即可,这里用python有一个很偷懒的办法,使用eval函数直接进行计算。
import copy
class Solution:
def minimizeResult(self, expression: str) -> str:
left, right = expression.split("+")
len_l = len(left)
len_r = len(right)
if len_l == 1 and len_r == 1:
return "(%s)" % expression
exp = []
for i_l in range(len_l):
for i_r in range(1, len_r+1):
t_l = list(copy.copy(left))
t_r = list(copy.copy(right))
if i_l == 0:
t_l.insert(i_l, "(")
else:
t_l.insert(i_l, "*(")
if i_r == len_r:
t_r.insert(i_r, ")")
else:
t_r.insert(i_r, ")*")
tmp_s = ''.join(t_l) + "+" + ''.join(t_r)
exp.append(tmp_s)
min_v = int(left) + int(right)
res = "(%s)" % expression
for e in exp:
v = eval(e)
if v < min_v:
min_v = v
res = e
res = res.replace("*", "")
return res
括号如果在两头,就直接填括号,如果不是在两头,就把乘号*也添加进来。