Split Array into Fibonacci Sequence Solutions in Go
Number 842
Difficulty Medium
Acceptance 36.3%
Link LeetCode
Other languages —
Solutions
Go solution by halfrost/LeetCode-Go
package leetcodeimport ("strconv""strings")func splitIntoFibonacci(S string) []int {if len(S) < 3 {return []int{}}res, isComplete := []int{}, falsefor firstEnd := 0; firstEnd < len(S)/2; firstEnd++ {if S[0] == '0' && firstEnd > 0 {break}first, _ := strconv.Atoi(S[:firstEnd+1])if first >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键!break}for secondEnd := firstEnd + 1; max(firstEnd, secondEnd-firstEnd) <= len(S)-secondEnd; secondEnd++ {if S[firstEnd+1] == '0' && secondEnd-firstEnd > 1 {break}second, _ := strconv.Atoi(S[firstEnd+1 : secondEnd+1])if second >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键!break}findRecursiveCheck(S, first, second, secondEnd+1, &res, &isComplete)}}return res}//Propagate for rest of the stringfunc findRecursiveCheck(S string, x1 int, x2 int, left int, res *[]int, isComplete *bool) {if x1 >= 1<<31 || x2 >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键!return}if left == len(S) {if !*isComplete {*isComplete = true*res = append(*res, x1)*res = append(*res, x2)}return}if strings.HasPrefix(S[left:], strconv.Itoa(x1+x2)) && !*isComplete {*res = append(*res, x1)findRecursiveCheck(S, x2, x1+x2, left+len(strconv.Itoa(x1+x2)), res, isComplete)return}if len(*res) > 0 && !*isComplete {*res = (*res)[:len(*res)-1]}return}func max(a int, b int) int {if a > b {return a}return b}