문자열이 합 문자열인지 여부를 확인하는 방법을 살펴보겠습니다. 가장 오른쪽 부분 문자열이 앞에 있는 두 부분 문자열의 합으로 쓰여질 수 있는 경우 문자열을 합 문자열이라고 하며, 그 앞의 부분 문자열에 대해서도 재귀적으로 마찬가지입니다. 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