https://leetcode.com/problems/expression-add-operators/
題目會給一組全部都是數字的字串,還有一個數字target
,請用+、-、*
組出能得到target
的算式,並回傳所有可能結果
今天的題目一看就知道要用backtracking
,但我還是寫不出來就是了
所以今天我就來分享看懂解答的過程,所以先上程式碼吧
class Solution:
def addOperators(self, num: str, target: int) -> List[str]:
def backtracking(index, prev, curr, n, path):
if index == len(num):
if target == n and curr == 0:
ans.append(''.join(path[1:]))
return
curr = curr * 10 + int(num[index])
if curr > 0: #一大坨東西
backtracking(index+1, prev, curr, n, path)
# 加
backtracking(index+1, curr, 0, n + curr, path + ['+', str(curr)])
if path:
#減
backtracking(index+1, -curr, 0, n - curr, path + ['-', str(curr)])
#乘
backtracking(index+1, prev * curr, 0, n - prev + prev * curr, path + ['*', str(curr)])
ans = []
backtracking(0, 0, 0, 0, [])
return ans
那我們就重頭開始吧!
def backtracking(index, prev, curr, n, path)
而這題的結束且有結果的條件有3個:
if index == len(num):
if target == n and curr == 0:
ans.append(''.join(path[1:]))
return
curr = curr * 10 + int(num[index])
算式裡的curr * 10
是因為字串裡的數字不只能當成個位數,也能組成二位數、三位數...
如果curr = 0
的話,就是把數字當個位數處理
if curr > 0: #一大坨東西
backtracking(index+1, prev, curr, n, path)
backtracking(index+1, curr, 0, n + curr, path + ['+', str(curr)])
prev的欄位放curr
是因為我們目前的數字對下個backtracking的數字來說是先前數字;curr的欄位放0則可以當成是一個新開始的算式;累積的結果加上去就好
if path
的判斷式,可以想成是要有東西可以減才成執行backtracking(index+1, -curr, 0, n - curr, path + ['-', str(curr)])
乘法看起來比較不一樣,在累積結果的部分出現減法是因為乘號的優先度較高,感覺如下面這張圖backtracking(index+1, prev * curr, 0, n - prev + prev * curr, path + ['*', str(curr)])
連我自己都看不懂我在打什麼了,建議還是自己動手拿紙筆模擬一遍好了
今天的題目是這個月第一次用到回朔法,結果就直接來hard題目了
如果有人和我一樣想不出來只能看解答的
看完後可以試解這題來看看自己是否已理解解答