题目:原题链接(中等)
标签:字符串、贪心算法、回溯算法
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O(N2) | O(N) | 224ms (12.77%) |
Ans 2 (Python) | O(N2) | O(N) | 40ms (96.72%) |
Ans 3 (Python) |
解法一(暴力解法):
class Solution:
def splitIntoFibonacci(self, S: str) -> List[int]:
N = len(S)
# 判断数字是否合法
def is_valid(n):
return not (int(n) > 0 and n[0] == "0") and int(n) <= (2 ** 31 - 1)
# 检查是否为斐波那契数列
def is_fibonacci(m, n):
if not is_valid(S[:m]) or not is_valid(S[m:n]):
return False
lst = [int(S[:m]), int(S[m:n])]
idx1 = n
while idx1 < N:
nn = lst[-1] + lst[-2] # 当前项
s1 = str(nn)
idx2 = idx1 + len(s1)
s2 = S[idx1:idx2]
if is_valid(s2) and s1 == s2:
lst.append(nn)
idx1 = idx2
else:
return False
return lst
# 筛选所有的斐波那契数列
for i in range(1, N):
for j in range(i + 1, N):
fibonacci_lst = is_fibonacci(i, j)
if fibonacci_lst:
return fibonacci_lst
return []
解法二(优化解法一):
class Solution:
def splitIntoFibonacci(self, S: str) -> List[int]:
MAX_INT = 2147483647
N = len(S)
# 判断数字是否合法
def is_valid(n):
return not (int(n) > 0 and n[0] == "0") and int(n) <= MAX_INT
# 检查是否为斐波那契数列
def is_fibonacci(m, n):
if not is_valid(S[:m]) or not is_valid(S[m:n]):
return False
lst = [int(S[:m]), int(S[m:n])]
idx1 = n
while idx1 < N:
nn = lst[-1] + lst[-2] # 当前项
s1 = str(nn)
idx2 = idx1 + len(s1)
s2 = S[idx1:idx2]
if is_valid(s2) and s1 == s2:
lst.append(nn)
idx1 = idx2
else:
return False
return lst
# 筛选所有的斐波那契数列
for i in range(1, min(10, N)):
for j in range(i + 1, min(i + 10, N)):
fibonacci_lst = is_fibonacci(i, j)
if fibonacci_lst:
return fibonacci_lst
return []