2472
定义DPi为以i结尾的回文字符串,所能组成的最大数量的回文字符串数量
有关键洞察为,回文字符串长度最多为k与k+1,对于k+2及后面的所有情况,都可以由贪心归纳为k与k+1
对于1到n的所有下标,dpi可由i-k+1与i-k两个下标得到,即分别对应以i为结尾的字符串长度为k与k+1的情况
首先判断以i为结尾的子串,在k与k+1的情况下是否能构成回文字符串
若都不能,则dpi取0
否则,取max
最终取1到n之间的dpMax
class Solution {
public:
int maxPalindromes(string s, int k) {
int n=s.size();
vector<int>dp(n,0);
bool flag=true;
for(int i=0;i<(k+1)/2;i++){
if(s[i]!=s[k-i-1]){
flag=false;
break;
}
}
if(flag){dp[k-1]=1;}
flag=true;
for(int i=0;i<(k+1)/2;i++){
if(s[i]!=s[k-i]){
flag=false;
break;
}
}
if(flag){dp[k]=1;}
int res=max(dp[k-1],dp[k]);
for(int i=1;i<=k;i++){dp[i]=max(dp[i],dp[i-1]);}
for(int i=k+1;i<n;i++){
bool flag0=true,flag1=true;
for(int j=0;j<k/2;j++){
if(s[i-k+1+j]!=s[i-j]){
flag0=false;
break;
}
}
for(int j=0;j<(k+1)/2;j++){
if(s[i-k+j]!=s[i-j]){
flag1=false;
break;
}
}
dp[i]=max(dp[i],dp[i-1]);
if(flag0){dp[i]=max(dp[i-k]+1,dp[i]);}
if(flag1){dp[i]=max(dp[i-k-1]+1,dp[i]);}
// for(int j=i-k+1;j<=(i+1)/2;j++){
// if(s[j]!=)
// }
res=max(res,dp[i]);
}
return res;
}
};

正解

