题目:
累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明:累加序列里的数 不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
思路:
字符串加法不存在整数溢出的问题
搜索的时候 数字不能以0开头,且位数至少有一位
每次求和往后判断是否满足,满足则继续推进
解答:
class Solution:
def isAdditiveNumber(self, num: str) -> bool:
#字符串加法,返回字符串a和字符串b 整数求和后的字符串结果
def helper(a, b):
i, j, res, one = len(a) - 1, len(b) - 1, [], 0
while i >= 0 or j >= 0:
curA = curB = 0
if i >= 0:
curA = int(a[i])
i -= 1
if j >= 0:
curB = int(b[j])
j -= 1
cur = curA + curB + one
if cur >= 10:
cur %= 10
one = 1
else:
one = 0
res.append(str(cur))
if one:
res.append("1")
return "".join(res[::-1])
def dfs(p, q):
start, first, second = 0, p, q
while second < len(num):
#不能出现以0打头的2位以上的数字
if (num[start] == '0' and first > start + 1) or (num[first] == '0' and second > first + 1):
return False
#求累加序列中的下一个数
s = helper(num[start:first], num[first:second])
if num[second:second+len(s)] != s:
return False
#往后推进,继续判断
start, first, second = first, second, second + len(s)
return True
n=len(num)
for i in range(1, n - 1):
for j in range(i + 1, n):
#判断以num[0:i]和nums[i:j]作为初始元素的序列,是否符合累加数定义
if dfs(i, j):
return True
return False