306.累加数

97 阅读1分钟

题目:
累加数 是一个字符串,组成它的数字可以形成累加序列。

一个有效的 累加序列 必须 至少 包含 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)
}