Palindrome Partitioning II
class Solution { ;
public:
int minCut(string s) {
int n = s.length();
vector<int> DP(n + 1, -1);
return recursive(s, 0, n - 1, DP);
}
int recursive(const string &s, int start, int end, vector<int> &DP) {
if (isPalindrome(s, start, end)) {
return 0;
}
if (DP[start] != -1) {
return DP[start];
}
int minVal = INT32_MAX;
for (int cut = start; cut < end; cut++) {
if (isPalindrome(s, start, cut)) {
int right = recursive(s, cut + 1, end, DP);
minVal = min(minVal, right + 1);
}
}
DP[start] = minVal;
return minVal;
}
bool isPalindrome(const string &s, int start, int end) {
while (start < end) {
if (s[start] != s[end]) {
return false;
}
start++;
end--;
}
return true;
}
};