一.题目介绍
二.题目分析
此题我们用"回文字串"的方法辅助"单词拆分"的思想来解决,我们设dp[ i ]为以 i 结尾的子串切割为回文串时最少的切割次数,但是在填dp表的前提是我们是否知道以 i 结尾的子串是否为回文串,不是才进行切割。所以我们将所有子串是否为回文串的信息保存在二维数组isPal表中,这里保存的方法就是"回文字串"的解题方法。
三.状态分析
四.完整代码
int minCut(string s)
{
int n = s.size();
vector<vector<bool>> isPal(n, vector<bool>(n));
for(int i = n-1; i >= 0; i--)
{
for(int j = i; j < n; j++)
{
if(s[i] == s[j])
{
if(i+1 < j)
isPal[i][j] = isPal[i+1][j-1];
else
isPal[i][j] = true;
}
}
} //完成统计
vector<int> dp(n, INT_MAX);
for(int i = 0; i < n; i++)
{
if(isPal[0][i] == true)
dp[i] = 0;
else
{
for(int j = i; j >= 0; j--)
{
if(isPal[j][i])
{
dp[i] = min(dp[i], dp[j-1] + 1);
}
}
}
}
return dp[n-1];
}