【LeetCode】306. 累加數 結題報告 (C++)
阿新 • • 發佈:2018-12-15
原題地址:https://leetcode-cn.com/problems/additive-number/
題目描述:
累加數是一個字串,組成它的數字可以形成累加序列。
一個有效的累加序列必須至少包含 3 個數。除了最開始的兩個數以外,字串中的其他數都等於它之前兩個數相加的和。
給定一個只包含數字 '0'-'9' 的字串,編寫一個演算法來判斷給定輸入是否是累加數。
說明: 累加序列裡的數不會以 0 開頭,所以不會出現 1, 2, 03 或者 1, 02, 3 的情況。
示例 1:
輸入: "112358"
輸出: true
解釋: 累加序列為: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:
輸入: "199100199"
輸出: true
解釋: 累加序列為: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
進階:
你如何處理一個溢位的過大的整數輸入?
解題方案:
回溯法的題型,採用廣度優先遍歷來實現。
本題的實現過程比較麻煩,置頂以後來學習。參考地址:https://blog.csdn.net/qq_23523409/article/details/84585030
程式碼:
class Solution { public: bool isAdditiveNumber(string num) { int size = num.size(); if (size <= 2) return false; string str1, str2, str3; int len1, len2; for (len1 = 1; len1 <= size / 2; len1++) { str1 = num.substr(0, len1); for (len2 = 1; len2 <= size / 2; len2++) { str2 = num.substr(len1, len2); str3 = num.substr(len1 + len2, size - len1 - len2); if (DFS(str1, str2, str3)) return true; } } return false; } bool DFS(string first,string second,string last) { if (first[0] == '0'&&first != "0" || second[0] == '0'&&second != "0") return false; string addstr = add(first, second); if (addstr.size() > last.size()) return false; if (addstr == last) return true; int size = addstr.size(); if (addstr != last.substr(0, size)) return false; first = second; second = addstr; last = last.substr(size, int(last.size()) - size); return DFS(first, second, last); } string add(string str1, string str2) { if (str1.size() < str2.size()) swap(str1, str2); int size1 = str1.size(); int size2 = str2.size(); str2 = string(size1 - size2, '0') + str2; int sgn = 0; for (int i = size1; i >= 1; i--) { int nums = str1[i - 1] - '0' + str2[i - 1] - '0' + sgn; str1[i - 1] = nums % 10 + '0'; sgn = nums / 10; } if (sgn == 1) str1 = "1" + str1; return str1; } };