题目:输入n个字符串,试图将每个字符串拆分成 数目最小 的回文串,输出回文串个数。
思路:
1️⃣(TLE):
用dp[i][j]来表示字符串的第i-j个字符所含的最少回文串。
for(int t = 0;t<=len-1;t++){
int i = 1;
while(1){//先对dp初始化,若第i-j个字符构成回文串则dp[i][j] = 1,否则dp[i][j] = 1<<30
int j = i + t;
for(int k = i;k<j;k++) dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);
i++;
if(j==len) break;
}
}
cout<<dp[1][len]<<endl;
但是复杂度O(n*n*n)超时
2️⃣:
用dp[i]表示1-i所能构成的最少回文串个数
for(int i = 1;i<=len;i++){
if(check[1][i]){dp[i]=1;continue;} //若字符i-j构成回文串,则check[i][j] = 1
for(int j=1;j<i;j++) if(check[j+1][i]) dp[i] = min(dp[i],dp[j]+1); //在j+1-i能构成回文串的情况下
}
cout<<dp[len]<<endl;
复杂度O(n*n),可过