class Solution {
public int minCut(String s) {
// edge cases
if (s == null || s.length() <= 1) return 0;
int n = s.length();
int[] dp = new int[n];
for (int i = 0; i < dp.length; i++) {
dp[i] = i;
}
for (int i = 0; i < n; i++) {
// 1st round, aba
int l = i, r = i;
while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {
int tmp = l == 0 ? 0 : dp[l-1] + 1; // if l reach head, 0 cut.
dp[r] = Math.min(dp[r], tmp);
l--;
r++;
}
// 2nd round, abba
l = i; r = i + 1;
while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {
int tmp = l == 0 ? 0 : dp[l-1] + 1; // if l reach head, 0 cut.
dp[r] = Math.min(dp[r], tmp);
l--;
r++;
}
}
return dp[n-1];
}
}