3
bool memo[50][50][2000];4
bool comp_seqs(string &s1, string &s2, int i1, int i2, int diff) {5
// check true condition6
if (i1 == s1.size() && i2 == s2.size()) return diff == 0;7
// add 1000 to 'diff' be in range [0, 2000)8
bool &ret = memo[i1][i2][diff + 1000];9
if (ret) return false; // immediately return10
ret = true; // check visited12
// diff > 0 or diff < 0 checking to ensure the diff always be in range13
// (-1000, 1000) in the case that s1[i1] is a digit14
if (diff >= 0 && i1 < s1.size() && s1[i1] <= '9') {16
for (int i = 0; i < min(3, (int)s1.size() - i1); i++) { // loop maximum 3 consecutive digits17
if (s1[i1 + i] > '9') break;18
num1 = num1 * 10 + s1[i1 + i] - '0';19
if (comp_seqs(s1, s2, i1 + i + 1, i2, diff - num1)) return true;21
} else if (diff <= 0 && i2 < s2.size() && s2[i2] <= '9') { // in the case that s2[i2] is a digit23
for (int i = 0; i < min(3, (int)s2.size() - i2); i++) {24
if (s2[i2 + i] > '9') break;25
num2 = num2 * 10 + s2[i2 + i] - '0';26
if (comp_seqs(s1, s2, i1, i2 + i + 1, diff + num2)) return true;28
} else if (diff == 0) {29
if (i1 >= s1.size() || i2 >= s2.size() || s1[i1] != s2[i2]) // reject infeasible cases31
return comp_seqs(s1, s2, i1 + 1, i2 + 1, 0);32
} else if (diff > 0) {33
if (i1 >= s1.size()) // reject infeasible cases35
return comp_seqs(s1, s2, i1 + 1, i2, diff - 1);37
if (i2 >= s2.size()) // reject infeasible cases39
return comp_seqs(s1, s2, i1, i2 + 1, diff + 1);43
bool possiblyEquals(string s1, string s2) {44
return comp_seqs(s1, s2, 0, 0, 0);