您的位置:首页 > 其它

LintCode-分割回文串 II

2015-08-09 14:34 246 查看
给定一个字符串s,将s分割成一些子串,使每个子串都是回文。
返回s符合要求的的最少分割次数。

您在真实的面试中是否遇到过这个题?

Yes

样例

比如,给出字符串s = "aab",
返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串

标签 Expand

相关题目 Expand

分析:一开始写了个n的三次的dp,结果超时,差不多是dp[i][j] = min(dp[i][k]+dp[k+1][j]+1)的思想,那么肯定要把它优化到n平方的dp,于是联想到word break那题,如果s[i][j]是回文串的话,就可以dp[j] = dp[i-1]+1了,从二维dp简化到一维dp,从而降低了复杂度

代码:

class Solution {
public:
/**
* @param s a string
* @return an integer
*/
int minCut(string s) {
// write your code here
int n = s.length();
vector<vector<bool> > dp1(n,vector<bool>(n,false));
for(int len = 1;len<=n;len++)
{
for(int i=0;i+len-1<n;i++)
{
int j = i+len-1;
if(len==1)
{
dp1[i][j]=true;
}
else
{
if(s[i]==s[j]&&(i==j-1||dp1[i+1][j-1]))
dp1[i][j] = true;
}
}
}
vector<int > dp2(n,INT_MAX);
for(int i=0;i<n;i++)
{
if(dp1[0][i])
dp2[i] = 0;
for(int j=0;j<i;j++)
{
if(dp1[j+1][i])
dp2[i] = min(dp2[i],dp2[j]+1);
}
}
return dp2[n-1];

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: