[842][中等][DFS] 将数组拆分成斐波那契序列
最后更新于
最后更新于
class Solution:
UPPER = 2 ** 31 - 1
def splitIntoFibonacci(self, S: str) -> List[int]:
n = len(S)
result = []
def dfs(start, series):
if start == n:
if len(series) >= 3:
result.append(series)
return True # 找到一个就可以返回, 不必再继续寻找, 应做剪枝
return
for i in range(start, n):
sub = S[start: i + 1]
if not (sub.startswith('0') and len(sub) > 1): # 剪枝1, 每个数字块不能以0开头, 单独的0除外
number = int(sub)
if number > self.UPPER: # 剪枝2, 如果当前数值过大, 后续的会更大, 不再继续向后搜索
break
if len(series) >= 2:
if number == series[-1] + series[-2]:
if dfs(i + 1, series + [number]): # 剪枝4, 已经找到一个结果, 无需继续查找
return True
elif number > series[-1] + series[-2]: # 剪枝3, 当前的数字已经大过期待值, 后续更大, 不再向后搜索
break
else: # 还没有凑齐两个数字, 先填至两个数字
if dfs(i + 1, series + [number]): # 剪枝4, 已经找到一个结果, 无需继续查找
return True
dfs(0, [])
return result[0] if len(result) > 0 else result