1.分析
分割回文串-ii_牛客题霸_牛客网 (nowcoder.com)
设F(i)表示的是前i个字符需要的最少分割次数。
用v[]暂存分割次数。
1.1当整个字符串都是回文时
F(i)=0;
1.2分割出一个回文子串
动态规划追求的逐次完成,因此我们需要将字符串分为[0,j] [j+1,i] 两部分。且要保证[j+1,i]是回文串,此时F(i)=F(j)+1;
初始状态:由于F(1)=0,且我们要找最小分割次数,对于任意一个字符串(长度为i),最大分割次数即是i-1。因此对于v[i],我们初始化为i-1。
2.代码
#include <algorithm>
class Solution {
public:
/**
*
* @param s string字符串
* @return int整型
*/
bool ispal(string s,int begin,int end)
{
string ss=s.substr(begin,end-begin);
string temp=ss;
reverse(ss.begin(), ss.end());
if(temp == ss)
return true;
else
return false;
}
int minCut(string s) {
// write code here
int size=s.size()+1;
vector<int> v;
v.resize(size);
for(int i=1;i<size;i++)
v[i]=i-1;
v[0]=0;
for(int i=2;i<size;i++)
{
for(int j=0;j<i;j++)
{
if(ispal(s,j,i))
{
if(j == 0)
v[i]=0;
else if(v[j]+1 < v[i])
v[i]=v[j]+1;
}
}
}
return v[size-1];
}
};
该文章介绍了一种使用动态规划解决分割回文串问题的方法。通过分析字符串,计算最少分割次数,当字符串为回文时,分割次数为0。代码示例中展示了如何检查子串是否为回文,并更新动态规划数组以找到最小分割次数。

1878

被折叠的 条评论
为什么被折叠?



