题目:
累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。
给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明: 累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
算法:
func isAdditiveNumber(num string) bool {
// index num的index
// sum 前面两个数之和
// n 当前是在找第几个数
var backtracking func(index, sum, n, preNum int) bool
backtracking = func(index, sum, n, preNum int) bool {
if index == len(num) {
return n > 3
}
for i := index; i < len(num); i ++ {
// 数字以0开头
if i == index && num[index] == '0' {
if sum != 0 && n > 2{
return false
}
return backtracking(i + 1, sum, n + 1, 0)
}
curNum, _ := strconv.Atoi(num[index:i + 1])
if n > 2 && curNum > sum {
break
}
if n <= 2 || curNum == sum {
if backtracking(i + 1, curNum + preNum, n + 1, curNum) {
return true
}
}
}
return false
}
return backtracking(0, 0, 1, 0)
}