leetcode--306:(递归) Additive Number
#2019.5.24:
leetcode_2: #306(未解决)很沮丧,今天这个问题没能解决出来,部分网友说回溯法能做,这个高级的算法还没学,之后补充
题目:累加数
Additive number is a string whose digits can form additive sequence.
A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.
Given a string containing only digits '0'-'9'
, write a function to determine if it's an additive number.
Note: Numbers in the additive sequence cannothave leading zeros, so sequence 1, 2, 03
or 1, 02, 3
is invalid.
今天学的是https://blog.csdn.net/weixin_37373020/article/details/80567919 的方法:
def junge(a,b,s):
c=a+b
temp=str(a)+str(b)+str(c)
if s==temp:
return True
elif len(s)<len(temp):
return False
if s[:len(temp)]==temp:
return junge(b,c,s[len(str(a)):])
else:
return False
for i in range(1,len(num)//2+1):
a=int(num[:i])
j=1
while j+i<(len(num)+i)//2+1:
b=int(num[i:i+j])
if junge(a,b,num):
return True
j+=1
return False
注意:双斜杠表示地板除,即先做除法(/),然后向下取整(floor)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型。
思考过程:1.坚持一个核心思想“如果一个数字a大于另一个数字b,那么a的位数至少与b一样或者多于b。”所以第一个数的位数一定少于等于字符数的一半。所以第一个数只取num字符数的一半或一半减一
2.第一个数取一位,取两位……直到num字符数的一半或一半减一不断尝试
3.第二个数也是取一位,取两位不断尝试
4.junge是一个递归函数,里面判断第一个数,第二个数,第三个数(假定是第一个数和第二个数的和,然后截取num同长度同位的数与之对比)的关系,满足的话取第二个数,第三个数,第四个数尝试
难点:第一个数,第二个数的位数是多少,需要做循环试探。
看到leetcode上最高点赞的回答是:
算法过程:运用了迭代器的方法取遍第一位数和第二位数的所有可能的组合;利用字符串方法的首字符对比,把可能的结果和原字符串对应位置的数字对比;第一位数,第二位数找到后就可以依次往后轮训对比了。佩服佩服~~