这道题目刚开始想错了,本来打算每次找到最大的回文串,结果自己给自己驳倒了,比如dabbbbbdb,最长回文子串是bbbbb,结果四个落单,一共是五个,而如果把最后的bdb放在一组,就一目了然了,4个,所以这种是不行的,到底该如何做呢
dp[j]代表了读到第j个字符的时候出现的回文串最小有多少个
k
#include <iostream>
using namespace std;
const int INF=0x3f3f3f3f;
string s;
int dp[5005];
int main()
{
while(cin>>s)
{
for(int i=1; i<=5005; i++)
dp[i]=INF;
s=" "+s;
dp[0]=0;
for(int i=1; i<s.size(); i++)
{
for(int j=i,k=i; j<s.size()&&k>0; j++,k--)
{
if(s[j]==s[k])
dp[j]=min(dp[j],dp[k-1]+1);
else break;
}//奇数回文串
for(int j=i+1,k=i;j<s.size()&&k>0; j++,k--)
{
if(s[j]==s[k])
dp[j]=min(dp[j],dp[k-1]+1);
else break;
}//偶数回文串
}
cout<<dp[s.size()-1]<<endl;
}
return 0;
}