Leetcode 132. Palindrome Partitioning II (Hard) (cpp)
Tag: Dynamic Programming
Difficulty: Hard
/*
132. Palindrome Partitioning II (Hard)
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab",
Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.
*/
class Solution {
public:
int minCut(string s) {
int _size = s.size();
vector<vector<bool>> t(_size, vector<bool>(_size, false));
vector<int> t2(_size + 1);
for (int i = 0; i <= _size; i++) {
t2[i] = i - 1;
}
for (int j = 1; j < _size; j++) {
for (int i = j; i >= 0; i--) {
if (s[i] == s[j] && (j - i < 2 || t[i + 1][j - 1])) {
t[i][j] = true;
t2[j + 1] = min(t2[j + 1], 1 + t2[i]);
}
}
}
return t2.back();
}
};
class Solution {
public:
int minCut(string s) {
int _size = s.size();
vector<int> t(_size + 1);
for (int i = 0; i <= _size; i++) {
t[i] = i - 1;
}
for (int i = 1; i < _size; i++) {
for (int j = 0; i - j >= 0 && i + j < _size && s[i - j] == s[i + j]; j++) {
t[i + j + 1] = min(t[i + j + 1], 1 + t[i - j]);
}
for (int j = 0; i - j - 1 >= 0 && i + j < _size && s[i - j - 1] == s[i + j]; j++) {
t[i + j + 1] = min(t[i + j + 1], 1 + t[i - j - 1]);
}
}
return t.back();
}
};