I first thought about the commented out method. However, that one is hard to split the numbers which start with '0'.
Second Method is from leetcode discuss forum.
// try backtracking?
//bool isAdditiveNumber(string nums, int start, int end) {
// if(end == nums.size()) return true;
// if(end - start < 2) return false;
// for(int i = start; i < nums.size() - 2; ++i) {
// string num_1 = nums.substr(start, i - start + 1);
// for(int j = i + 1; j < nums.size() - 1; ++j) {
// string num_2 = nums.substr(i + 1, j - i);
// for(int k = j + 1; k < nums.size(); ++k) {
// string num_3 = nums.substr(j + 1, k - j);
// int a = stoi(num_1);
// int b = stoi(num_2);
// int c = stoi(num_3);
// if(a + b == c) {
// return isAdditiveNumber(nums, i + 1, k + 1);
// }
// }
// }
// }
// return false;
//}
//
//bool isAdditiveNumber(string num) {
// int start = 0;
// int end = num.size() - 1;
// return isAdditiveNumber(num, start, end);
//}
bool ok(string& num, int idx, unsigned long a, unsigned long b) {
if(idx == num.size()) return true;
unsigned long c = 0;
for(int i = idx; i < num.size(); ++i) {
c = c * 10 + num[i] - '0';
if(a + b == c) {
if(ok(num, i + 1, b, c)) return true;
} else if(a + b < c) break;
if(num[idx] == '0') break;
}
return false;
}
bool isAdditiveNumber(string num) {
unsigned long a = 0; // pay attention to the unsigned long type.
for(int i = 0; i < num.size(); ++i) {
a = a * 10 + num[i] - '0';
unsigned long b = 0;
for(int j = i + 1; j < num.size(); ++j) {
b = b * 10 + num[j] - '0';
if(j + 1 < num.size() && ok(num, j + 1, a, b)) return true;
if(num[i+1] == '0') break;
}
if(num[0] == '0') break;
}
return false;
}
int main(void) {
cout << isAdditiveNumber("12358") << endl;
cout << isAdditiveNumber("211738") << endl;
cout << isAdditiveNumber("199100199") << endl;
cout << isAdditiveNumber("198019823962") << endl;
}