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上最高点赞的回答是:

  算法过程:运用了迭代器的方法取遍第一位数和第二位数的所有可能的组合;利用字符串方法的首字符对比,把可能的结果和原字符串对应位置的数字对比;第一位数,第二位数找到后就可以依次往后轮训对比了。佩服佩服~~

原文地址:https://www.cnblogs.com/marvintang1001/p/11171992.html