迭代回溯法, 用兩個指針來切割字符串,將字符串分為三個部分,前兩部分作為第一個數字和第二個數字,計算他們的和,作為result, 然后在第三部分查找是否以result開頭,用startswith()函數判斷。如果不是就剪掉,也就是break,如果是,second 變成新的first, third中result部分變成新的second, 剩下變成third,循環下去,判斷一下最后third是不是到字符串末尾了,如果到了,return true
class Solution(object):
def isAdditiveNumber(self, num):
"""
:type num: str
:rtype: bool
"""
n = len(num)
if num == None or len(num) < 3:
return False
for i in range(1, n/2+1):
if i > 1 and num[0] == '0':
break
for j in range(i+1, (i+n)/2 + 1):
if j > i+1 and num[i] == '0':
break
first, second, third = 0, i, j
while third < n:
first_num = int(num[first:second])
second_num = int(num[second:third])
result = first_num + second_num
if num[third:].startswith(str(result)):
first, second, third = second, third, third + len(str(result))
else:
break
if third == n:
return True
return False
另一種寫法,combinations(iterable,r);創建一個迭代器,返回iterable中所有長度為r的子序列,返回的子序列中的項按輸入iterable中的順序排序
class Solution(object):
def isAdditiveNumber(self, num):
"""
:type num: str
:rtype: bool
"""
n = len(num)
for i, j in itertools.combinations(range(1, n), 2):
print i, j
a, b = num[:i], num[i:j]
if b != str(int(b)):
continue
while j < n:
c = str(int(a) + int(b))
if not num.startswith(c, j):
break
j += len(c)
a, b = b, c
if j == n:
return True
return False