题目:为运算表达式设计优先级
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例一:
输入: “2-1-1”
输出: [0, 2]
解释: ((2-1)-1) = 0 (2-(1-1)) = 2
这里主要是以分治算法来求解这道题,关于分治算法的思路,可以click here,。
1、要解决什么?
给定含有数据和运算符的字符串,填上括号,救出不同值结果的个数。
2、如何使用分治算法去解决?
对于一个形如 x op
y(op 为运算符,x 和 y 为数) 的算式而言,它的结果组合取决于 x 和 y 的结果组合数,而 x 和 y 又可以写成形如 x op
y 的算式。
因此,该问题的子问题就是 x op
y 中的 x 和 y:以运算符分隔的左右两侧算式解。
然后我们来进行分治算法三步走:
分解:按运算符分成左右两部分,分别求解
解决:实现一个递归函数,输入算式,返回算式解
合并:根据运算符合并左右两部分的解,得出最终解
3、代码
class Solution:
def diffWaysToCompute(self, input: str) -> List[int]:
# 如果input是数字的话就直接返回
if input.isdigit():
return [int(input)]
res = []
for i, char in enumerate(input):
if char in ['+', '-', '*']:
# 1.分解:遇到运算符,计算左右两侧的结果集
# 2.求解:diffWaysToCompute 递归函数求出子问题的解
left = self.diffWaysToCompute(input[:i])
right = self.diffWaysToCompute(input[i+1:])
# 3.合并:根据运算符合并子问题的解
for l in left:
for r in right:
if char == '+':
res.append(l + r)
elif char == '-':
res.append(l - r)
else:
res.append(l * r)
return res
参考资料:
【1】Python/Golang 分治算法