这个题解的思路是暴力搜索所有可能的累加数组合。具体来说:
1. 首先判断字符串长度是否小于3,如果是就直接返回False,因为累加序列至少要有3个数。
2. 然后用两个循环来枚举前两个数a和b。第一个数a的范围是[0,length//2],第二个数b的范围是[i+1,length],其中i是a的结束位置。
3. 在枚举a和b时,如果a或b以0开头且不是0本身,就跳过。
4. 对于每一对a和b,调用辅助函数my_check来检查以a和b开头能否形成有效的累加序列。
5. my_check函数递归地计算a+b,将结果与原字符串的剩余部分比较,如果吻合就继续递归检查b和a+b,否则返回False。
6. 如果找到任何一个有效的a和b组合,就返回True,否则在所有组合都检查完后返回False。
时间复杂度: O(n^4)
空间复杂度: O(n)
```python
from collections import deque
class Solution:
def isAdditiveNumber(self, num: str) -> bool:
length = len(num)
if length < 3: return False
max_length = length // 2
num_list = []
def my_check(a, b, string):
'''
递归检查以a和b开头的累加序列能否与字符串string匹配
a: 第一个数
b: 第二个数
string: 待匹配的字符串
'''
c = a + b
c_string = str(a + b)
if not string.startswith(c_string):
return False
else:
c_len = len(c_string)
if c_len == len(string): return True
else:
return my_check(b, c, string[c_len:])
if num[:2] == '00':
return my_check(0, 0, num[2:])
if num[0] == '0':
for j in range(1, length//2):
b = int(num[1:j+1])
return my_check(0, b, num[j+1:])
for i in range(0, length//2):
a = int(num[:i+1])
if num[i+1] == '0':
if my_check(a, 0, num[i+2:]):
return True
else:
for j in range(i+1, length):
b = int(num[i+1:j+1])
if my_check(a, b, num[j+1:]):
return True
return False
```