題目描述:給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。
解題思路一:對於每乙個運算符號,先執行兩邊的表示式,然後再處理當前這個符號,採用分治的思想,**如下:
class
solution
:def
diffwaystocompute
(self,
input
:str)-
> list[
int]
:# res = set()
nums =
ops =
n =len(
input
) i =
0while
(i < n):if
not(
ord(
'0')
<=
ord(
input
[i])
<=
ord(
'9')):
input
[i])
i +=
1 j = i
while
(j < n and
ord(
'0')
<=
ord(
input
[j])
<=
ord(
'9')):
j +=
1int
(input
[i:j]))
i = j
# from collections import defaultdict
# g = defaultdict(list)
defcal
(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:
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 =
0while
(i < n):if
not(
ord(
'0')
<=
ord(
input
[i])
<=
ord(
'9')):
input
[i])
i +=
1 j = i
while
(j < n and
ord(
'0')
<=
ord(
input
[j])
<=
ord(
'9')):
j +=
1int
(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]
if i ==0:
dp[j]
[j+i]
)return dp[0]
[n-1
]
241 為運算表示式設計優先順序
思路 分治法 不同位置新增括號的作用在於改變不同運算子的優先順序。所以,可以在遍歷的過程中依次把運算子設為第一優先順序,遞迴計算左邊和右邊。class solution def diffwaystocompute self,input str list int if input isdigit 全數...
241 為運算表示式設計優先順序
給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 示例 1 輸入 2 1 1 輸出 0,2 解釋 2 1 1 0 2 1 1 2 示例 2 輸入 23 45 輸出 34,14,10,10,10 解釋 2 3...
241 為運算表示式設計優先順序(分治)
給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 看到題就覺得有點複雜,可以考慮一下遞迴的方式,去尋找子問題和原問題解的關係。可以通過運算子把整個式子分成兩部分,兩部分再利用遞迴解決。以 2 3 4 5 為...