题解68 | #累加序列#
累加序列
https://www.nowcoder.com/practice/ff244079fdaf4d8f9767887ec9582043
class Solution { public: bool AdditiveArray(string arr) { int n = arr.size(); for (int i = 1; i <= n / 2; i++) { for (int j = 1; j <= (n - i) / 2; j++) { if (isValid(arr, i, j)) { return true; } } } return false; } bool isValid(string arr, int i, int j) { if (arr[0] == '0' && i > 1) return false; if (arr[i] == '0' && j > 1) return false; string num1 = arr.substr(0, i); string num2 = arr.substr(i, j); int k = i + j; while (k < arr.size()) { string sum = addStrings(num1, num2); if (k + sum.size() > arr.size() || arr.substr(k, sum.size()) != sum) { return false; } num1 = num2; num2 = sum; k += sum.size(); } return true; } string addStrings(string num1, string num2) { string res; int carry = 0; int i = num1.size() - 1, j = num2.size() - 1; while (i >= 0 || j >= 0 || carry) { int x = i >= 0 ? num1[i--] - '0' : 0; int y = j >= 0 ? num2[j--] - '0' : 0; int sum = x + y + carry; res = to_string(sum % 10) + res; carry = sum / 10; } return res; } };
算法的基本思想
使用双重循环来遍历可能的第一个数和第二个数的长度,然后检查剩余的字符串是否满足累加序列的性质。在检查过程中,使用addStrings函数来计算两个字符串形式的数字的和,并使用isValid函数来验证剩余的字符串是否满足累加序列的性质。
时间复杂度分析:
外层循环遍历可能的第一个数的长度,内层循环遍历可能的第二个数的长度,因此时间复杂度为O(n^2),其中n为字符串的长度。
在isValid函数中,使用了addStrings函数来计算两个字符串的和,addStrings函数的时间复杂度为O(max(m, n)),其中m和n分别为两个字符串的长度。因此,isValid函数的时间复杂度为O(n)。
综合起来,整个算法的时间复杂度为O(n^3)。
空间复杂度分析:
算法使用了常数级别的额外空间来存储变量和结果,因此空间复杂度为O(1)。
2024考研数据结构 文章被收录于专栏
本人考研刷算法题,立此专栏练习强化。