Palindrome Partitioning IV
Description​
The problem is to determine if a given string can be partitioned into substrings such that every substring is a palindrome, and you are allowed to perform at most k changes to the characters of the string.
Problem Definition​
- Input: A string
sand an integerk. - Output: Return
trueif the string can be partitioned into palindromes with at mostkchanges; otherwise, returnfalse.
Example​
- Input:
s = "abc",k = 1
- Output:
true(the substring "a" can remain as is, and "b" can be changed to "c" to form "aca").
Algorithm Overview​
- Use a two-pointer approach to check for palindromes.
- Count the number of characters that need to be changed for each substring to make it a palindrome.
- If the total changes exceed
k, return false; otherwise, return true.
Time Complexity​
- O(n^2) - where
nis the length of the string.
C++ Implementation​
#include <iostream>
#include <vector>
using namespace std;
bool isPalindrome(string& s, int left, int right) {
while (left < right) {
if (s[left++] != s[right--]) return false;
}
return true;
}
bool canPartitionWithKChanges(string s, int k) {
int n = s.size();
vector<vector<int>> dp(n + 1, vector<int>(k + 1, INT_MAX));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (isPalindrome(s, j, i - 1)) {
for (int changes = 0; changes <= k; changes++) {
dp[i][changes] = min(dp[i][changes], dp[j][changes]);
}
}
}
for (int changes = 1; changes <= k; changes++) {
dp[i][changes] = min(dp[i][changes], dp[i - 1][changes - 1] + 1);
}
}
return dp[n][k] <= k;
}
int main() {
string s = "abc";
int k = 1;
cout << (canPartitionWithKChanges(s, k) ? "True" : "False") << endl;
return 0;
}