思路:
使用动态规划,dp[i][j]表示将子串s[0..i]划分成j个回文串所需要的最小修改次数。
实现:
1 class Solution 2 { 3 public: 4 int palindromePartition(string s, int k) 5 { 6 int n = s.length(); 7 vector<vector<int>> m(n, vector<int>(n, 0x3f3f3f3f)); 8 for (int i = n - 1; i >= 0; i--) 9 { 10 for (int j = i; j < n; j++) 11 { 12 if (j == i) m[i][j] = 0; 13 else if (j == i + 1) m[i][j] = s[i] != s[j]; 14 else 15 { 16 m[i][j] = m[i + 1][j - 1]; 17 if (s[i] != s[j]) m[i][j]++; 18 } 19 } 20 } 21 vector<vector<int>> dp(n, vector<int>(k + 1, 0x3f3f3f3f)); 22 for (int i = 0; i < n; i++) 23 { 24 dp[i][1] = m[0][i]; 25 for (int p = 2; p <= min(k, i + 1); p++) 26 { 27 for (int j = 0; j < i; j++) 28 { 29 dp[i][p] = min(dp[i][p], dp[j][p - 1] + m[j + 1][i]); 30 } 31 } 32 } 33 return dp[n - 1][k]; 34 } 35 }