该题解使用回溯法,采用深度优先搜索的思路,递归地在数字字符串的每个位置尝试添加不同的运算符(+、- 或 *),生成所有可能的表达式,并在表达式结果等于目标值时加入结果列表。在递归过程中,通过维护当前的计算结果 res 和上一次乘法的值 mul,可以在添加新运算符时,根据上一次的操作符进行相应的计算。
时间复杂度: O(4^n)
空间复杂度: O(n) + O(4^n)
class Solution:
def addOperators(self, num: str, target: int) -> List[str]:
n = len(num)
ret = []
def helper(expr, i, res, mul):
if i == n:
# 当处理完所有数字后,如果结果等于目标值,则将当前表达式加入结果列表
if res == target:
ret.append(''.join(expr))
return
signIdx = len(expr)
if i > 0:
expr.append('') # 在表达式中添加一个占位符,用于存储运算符
val = 0
for j in range(i, n):
if j > i and num[i] == '0':
break # 如果当前数字为 0,且不是单独的 0,则不继续处理
val = val * 10 + int(num[j]) # 计算当前处理的数字
expr.append(num[j]) # 将数字添加到表达式中
if i == 0:
# 如果是第一个数字,不需要添加运算符,直接递归处理下一个数字
helper(expr, j + 1, val, val)
else:
# 尝试添加不同的运算符
expr[signIdx] = '+'
helper(expr, j + 1, res + val, val)
expr[signIdx] = '-'
helper(expr, j + 1, res - val, -val)
expr[signIdx] = '*'
helper(expr, j + 1, res - mul + mul * val, mul * val)
del expr[signIdx:] # 回溯,删除当前处理的数字和运算符
helper([], 0, 0, 0)
return ret