int minCut(string s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(s.empty())
return 0;
int n = s.size();
vector<vector<bool>> bPalin(n,vector<bool>(n,false));
int i,j;
for(i=0;i<n;i++)
bPalin[i][i] = true;
for(i=0;i<n-1;i++)
bPalin[i][i+1] = (s[i]==s[i+1]?true:false);
for(i=n-3;i>=0;i--)
for(j=i+2;j<n;j++)
bPalin[i][j] = (bPalin[i+1][j-1]&&s[i]==s[j]?true:false);
if(bPalin[0][n-1])
return 0;
vector<int> dp(n);
dp[0] = 0;
for(j=1;j<n;j++)
{
if(bPalin[0][j])
dp[j] = 0;
else
{
int mincut = j;
for(i=1;i<=j;i++)
{
if(bPalin[i][j])
mincut = min(mincut,dp[i-1]+1);
}
dp[j] = mincut;
}
}
return dp[n-1];
}