Palindrome precompute
isPalin[i][j] = is s[i..j] a palindrome? 2D DP.
for (int len = 1; len <= n; len++)
for (int i = 0; i + len <= n; i++) {
int j = i + len - 1;
if (s[i] == s[j] && (len < 3 || isPalin[i+1][j-1]))
isPalin[i][j] = true;
}Advertisement
Min cuts DP
dp[i] = min cuts for s[0..i]. If palindrome from start, dp[i] = 0. Else dp[i] = min over j: dp[j-1] + 1 if s[j..i] palindrome.
Advertisement
Combined
for (int i = 0; i < n; i++) {
if (isPalin[0][i]) { dp[i] = 0; continue; }
dp[i] = i;
for (int j = 1; j <= i; j++)
if (isPalin[j][i])
dp[i] = min(dp[i], dp[j-1] + 1);
}
return dp[n-1];Complexity
O(N²) time + space.