DP.
先利用DP计算每个substr是否为Palindrome,再利用DP计算mincut.
class Solution {
public:
int minCut(string s) {
const int n = s.size();
if(n == 0) return 0;
vector<vector<bool> > f(n, vector<bool>(n, false));
for(int i=0; i<n; i++)
f[i][i] = true;
for(int L=2; L<=n; L++)
{
for(int start=0; start<=n-L; start++)
{
int end = start+L-1;
f[start][end] = (L==2)?
(s[start] == s[end]):
(s[start] == s[end] && f[start+1][end-1]);
}
}
vector<int> mincut(n+1, INT_MAX);
mincut[0] = -1;
for(int i=1; i<=n; i++)
{
for(int j=0; j<i; j++)
{
if(f[j][i-1])
mincut[i] = min(mincut[i], (mincut[j]+1));
}
}
return mincut[n];
}
};