123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- func isAdditiveNumber(num string) bool {
- n := len(num)
- if n < 3 { // At least 3 chars
- return false
- }
- for i := 1; i < (n+1)/2; i++ {
- if num[0] == '0' && i != 1 { // Avoid 00 + ...
- return false
- }
- for j := 1; j <= (n-i)/2; j++ {
- if num[i] == '0' && j != 1 { // Avoid ... + 0x
- break
- }
- var one, two int
- fmt.Sscan(num[0:i], &one)
- fmt.Sscan(num[i:i+j], &two)
- if search(num, i+j, one, two) {
- return true
- }
- }
- }
- return false
- }
- func search(num string, idx, one, two int) bool {
- n := len(num)
- if idx == n {
- return true
- } else if num[idx] == '0' {
- if one+two != 0 {
- return false
- }
- return search(num, idx+1, 0, 0) // 00000000... is valid
- }
- var three int
- for three = 0; three < one+two && idx < n; idx++ {
- three = three*10 + int(num[idx]-'0')
- }
- if three == one+two {
- return search(num, idx, two, three)
- }
- return false
- }
- type pair struct {
- _1 int
- _2 int
- }
|