1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { public: bool checkPartitioning(string s) { string t = ""; for (char& chr : s) t.push_back('#'), t.push_back(chr); t.push_back('#'); int p[4005], r = 0, c = 0; for (int i = 1; i <= t.size(); ++i) { p[i] = 1; int mirror = 2 * c - i; if (i <= r && mirror >= 1) p[i] = min(r - i + 1, p[mirror]); while (i - p[i] >= 1 && i + p[i] <= t.size() && t[i - p[i] - 1] == t[i + p[i] - 1]) p[i]++; if (i + p[i] - 1 > r) c = i, r = i + p[i] - 1; } bool f[2005]; memset(f, 0, sizeof(f)); f[0] = 1; for (int j = 1; j <= 3; ++j) { for (int r = s.size(); r >= 1; --r) { f[r] = 0; for (int l = r; l >= j; --l) { if (f[r]) break; f[r] |= f[l - 1] & (p[l + r] >= r - l + 1); } } } return f[s.size()]; } };
|