题目描述:给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
解题思路一:对于每一个运算符号,先执行两边的表达式,然后再处理当前这个符号,采用分治的思想,代码如下:
class Solution:
def diffWaysToCompute(self, input: str) -> List[int]:
# res = set()
nums = []
ops = []
n = len(input)
i = 0
while(i < n):
if not (ord('0') <= ord(input[i]) <= ord('9')):
ops.append(input[i])
i += 1
j = i
while(j < n and ord('0') <= ord(input[j]) <= ord('9')):
j += 1
nums.append(int(input[i:j]))
i = j
# from collections import defaultdict
# G = defaultdict(list)
def cal(nums, ops):
if len(nums) == 1:
return [str(nums[0])]
n = len(ops)
ans = []
for i in range(n):
left = cal(nums[:i+1], ops[:i])
right = cal(nums[i+1:n+1], ops[i+1:n])
for l in left:
for r in right:
ans.append(str(eval(l+ops[i]+r)))
return ans
ans = cal(nums, ops)
return [int(num) for num in ans]
解题思路二:在思路一中很多子问题的解都重复求解了,改用动态规划自下而上进行求解,代码如下:
class Solution:
def diffWaysToCompute(self, input: str) -> List[int]:
# res = set()
nums = []
ops = []
n = len(input)
i = 0
while(i < n):
if not (ord('0') <= ord(input[i]) <= ord('9')):
ops.append(input[i])
i += 1
j = i
while(j < n and ord('0') <= ord(input[j]) <= ord('9')):
j += 1
nums.append(int(input[i:j]))
i = j
from collections import defaultdict
n = len(nums)
dp = [[[] for i in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n-i):
for k in range(j,j+i):
for left in dp[j][k]:
for right in dp[k+1][j+i]:
if ops[k] == '+':
val = left + right
elif ops[k] == '-':
val = left - right
else:
val = left * right
dp[j][j+i].append(val)
if i == 0:
dp[j][j+i].append(nums[j])
return dp[0][n-1]