在 C++ 中检查给定字符串是否是总和字符串
在这里,我们将看到如何检查一个字符串是否为总和字符串。如果一个字符串的最右边的子字符串可以写成其前面两个子字符串的总和,并且它前面的子字符串也递归地满足这个条件,那么这个字符串被称为总和字符串。比如像 12243660 这样的一个字符串是一个总和字符串,比如 12 + 24 = 36,这个 36 就出现在字符串中的 12 和 24 之后,同样的,24 + 36 = 60,这也出现在字符串中。
如果一个字符串 S 满足以下规则,那么它可以称为总和字符串 −
𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑖,𝑥)+𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑥+1,𝑗)= 𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑗+1,𝑙)
𝑎𝑛𝑑 𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑥+1,𝑗)+𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑗+1,𝑙)= 𝑠𝑢𝑏𝑠𝑡𝑟𝑖𝑛𝑔(𝑙+1,𝑚) 𝑎𝑛𝑑 𝑠𝑜 𝑜𝑛
示例
#include <bits/stdc++.h>
using namespace std;
string get_string_sum(string str1, string str2) {
if (str1.size() < str2.size())
swap(str1, str2);
int len1 = str1.size();
int len2 = str2.size();
string ans = "";
int carry = 0;
for (int i = 0; i < len2; i++) {
int ds = ((str1[len1 - 1 - i] - '0') + (str2[len2 - 1 - i] - '0') + carry) % 10;
carry = ((str1[len1 - 1 - i] - '0') + (str2[len2 - 1 - i] - '0') + carry) / 10;
ans = char(ds + '0') + ans;
}
for (int i = len2; i < len1; i++) {
int ds = (str1[len1 - 1 - i] - '0' + carry) % 10;
carry = (str1[len1 - 1 - i] - '0' + carry) / 10;
ans = char(ds + '0') + ans;
}
if (carry)
ans = char(carry + '0') + ans;
return ans;
}
bool sumStrCheckHelper(string str, int beg, int len1, int len2) {
string sub1 = str.substr(beg, len1);
string sub2 = str.substr(beg + len1, len2);
string sum = get_string_sum(sub1, sub2);
int sum_len = sum.size();
if (sum_len > str.size() - len1 - len2 - beg)
return false;
if (sum == str.substr(beg + len1 + len2, sum_len)) {
if (beg + len1 + len2 + sum_len == str.size())
return true;
return sumStrCheckHelper(str, beg + len1, len2, sum_len);
}
return false;
}
bool isSumStr(string str) {
int n = str.size();
for (int i = 1; i < n; i++)
for (int j = 1; i + j < n; j++)
if (sumStrCheckHelper(str, 0, i, j))
return true;
return false;
}
int main() {
if(isSumStr("1212243660"))
cout << "This is sum-string";
else
cout << "This is not sum-string";
}输出
This is sum-string
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP