1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| class Solution { public boolean isAdditiveNumber(String num) { for (int j = 1; j < num.length() - 1; j++) { String firstNum = num.substring(0, j); for (int k = j + 1; k < num.length(); k++) { String secondNum = num.substring(j, k); if (dfs(num, k, firstNum, secondNum, true)) { return true; } } }
return false; }
private boolean dfs(String num, int startIndex, String firstNum, String secondNum, boolean firstMatch) { if (firstNum.length() > 1 && firstNum.startsWith("0")) { return false; } if (secondNum.length() > 1 && secondNum.startsWith("0")) { return false; }
if (startIndex == num.length()) { return !firstMatch; }
String exceptedSum = add(firstNum, secondNum); if (startIndex + exceptedSum.length() > num.length() || !num.startsWith(exceptedSum, startIndex)) { return false; }
return dfs(num, startIndex + exceptedSum.length(), secondNum, exceptedSum, false); }
private String add(String str1, String str2) { StringBuilder sb = new StringBuilder(); int carry = 0; int i = str1.length() - 1, j = str2.length() - 1;
while (i >= 0 || j >= 0) { int x = i >= 0 ? str1.charAt(i) - '0' : 0; int y = j >= 0 ? str2.charAt(j) - '0' : 0;
int sum = carry + x + y; carry = sum / 10; sb.append(sum % 10);
i--; j--; }
if (carry != 0) { sb.append(carry); }
return sb.reverse().toString(); } }
|