Q:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab"
,
Return 1
since the palindrome partitioning ["aa","b"]
could be produced using 1 cut.
A: 两个DP的结合: dp[i] = min(1+dp[j-1]) 如果s(i,j)是回文的。
同时检查回文也是一个DP
int minCut(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(s.empty())
return 0;
vector<vector<bool>> bPalin;
int i,j;
for(i=0;i<s.size();i++)
bPalin.push_back(vector<bool>(s.size()));
for(i=0;i<s.size();i++)
bPalin[i][i] = true;
for(i=s.size()-2;i>=0;i--)
{
bPalin[i][i+1] = (s[i]==s[i+1]?true:false);
for(j=i+2;j<s.size();j++)
{
if(s[i]==s[j]&&bPalin[i+1][j-1])
bPalin[i][j] = true;
else bPalin[i][j] = false;
}
}
if(bPalin[0][s.size()-1])
return 0;
vector<int> dp(s.size());
for(i=0;i<s.size();i++)
{
if(bPalin[0][i])
{
dp[i] = 0;
continue;
}
int curmin = INT_MAX;
for(j=1;j<=i;j++)
{
if(bPalin[j][i]&&dp[j-1]+1<curmin)
curmin = dp[j-1]+1;
}
dp[i] = curmin;
}
return dp[s.size()-1];
}