这种在计算para时候,还可以优化,进一步压缩时间。
class Solution {
public:
// 将s分成k个非空不相交子串,每个是para
// 对s至少替换多少次?返回最小次数。
int func(string s){
int ii=0;
int jj=s.size()-1;
int res = 0;
while(ii<jj){
if (s[ii]!=s[jj]){
res++;
}
ii++;
jj--;
}
return res;
}
int palindromePartition(string s, int k) {
int row = s.size();
int col = k+1;
vector<int> temp(col, 1e9);
vector<vector<int>> dp(row, temp);
// for j=1
for(int i=row-1;i>=0;i--){
string ss = s.substr(i, s.size()-i);
dp[i][1] = func(ss);
}
// for j=2,3,4..
for(int j=2;j<=k;j++){
for(int i=row-j;i>=0;i--){
// dp[i][j]
int res = 1e9;
for(int kk=i;kk<=row-2;kk++){ // [i,kk]
res = min(res, func(s.substr(i, kk-i+1))+dp[kk+1][j-1]);
}
dp[i][j] = res;
}
}
/*
// for debug
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}*/
return dp[0][col-1];
}
};