假设我们有一个仅包含从'0'到'9'的数字的字符串,我们必须编写一个函数来确定它是否为加数。加号是一个字符串,其数字可以形成加号序列。有效的加法序列应至少包含三个数字。在此,除了前两个数字外,序列中的每个后续数字都必须是前两个数字的和。因此,如果输入类似于“ 112358”,则答案将是正确的,因为2 = 1 + 1、3 = 1 + 2、5 = 2 + 3、8 = 3 + 5。
为了解决这个问题,我们将遵循以下步骤-
定义一个名为的方法ok()
,它将采用s,index,prev1,prev2
如果索引> = s的大小,则返回true
req:= prev1 + prev2和num:= req作为字符串
x:=一个空白字符串
对于i在s大小的范围索引中
x:= x + s [i]
如果x = num,并且ok(s,i + 1,prev2,x为整数),则返回true
返回假
从主要方法中执行以下操作-
n:= num的大小
当我在1到n – 2的范围内时
s1:= num的子串,从0到j – 1
s2:=从j到i – num的子字符串
x:= s1大小和s2大小的最大值
如果x> n – i,则进行下一次迭代
如果(s1 [0]为0且s1的大小> 0)或(s2 [0]为0且s2的大小> 1),则跳至下一个迭代
如果ok(num,i + 1,s1为整数,s2为整数)为true,则返回true
对于1到i范围内的j
返回假
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: bool ok(string s, int idx, lli prev1, lli prev2){ if(idx >= s.size()) return true; lli req = prev1 + prev2; string num = to_string(req); string x = ""; for(int i = idx; i < s.size(); i++){ x += s[i]; if(x == num && ok(s, i + 1, prev2, stol(x))) return true; } return false; } bool isAdditiveNumber(string num) { int n = num.size(); for(int i = 1; i < n - 1; i++){ for(int j = 1; j <= i; j++){ string s1 = num.substr(0, j); string s2 = num.substr(j, i - j + 1); int x = max((int)s1.size(), (int)s2.size()); if(x > n - i) continue; if((s1[0] == '0' && s1.size() > 1) || (s2[0] == '0' && s2.size() > 1)) continue; if(ok(num, i + 1, stol(s1), stol(s2))) return true; } } return false; } }; main(){ Solution ob; cout << (ob.isAdditiveNumber("112358")); }
"112358"
输出结果
1