class Solution {
public:
int minCut(string s) {
int n = s.length();
if (n <= 1) return 0;
vector<vector<int> > dp;
dp.resize(n);
for (int i = 0; i < n; ++i) {
dp[i].resize(n);
dp[i][i] = 1;
}
for (int l = 1; l < n; ++l) {
for (int i = 0; i + l < n; ++i) {
if (s[i] == s[i + l] && (l == 1 || dp[i + 1][i + l - 1]))
dp[i][i + l] = 1;
}
}
vector<int> vi(n);
for (int i = 1; i < n; ++i) {
if (dp[0][i]) {
vi[i] = 0;
} else {
vi[i] = n - 1;
for (int j = i; j > 0; --j) {
if (dp[j][i]) {
vi[i] = min(vi[i], vi[j - 1] + 1);
}
}
}
}
return vi[n - 1];
}
};