力扣132. 分割回文串 II
题目
题目解析及思路
题目要求返回将s切割成若干回文串的最少切割次数
对于子串s[j...i]
,若为回文串,则问题变为求s[0...j]
的最少切割次数
因此可以考虑动态规划
对于问题s[j...i]
是否为回文串,若s[i] == s[j]
则问题变成s[j+1...i-1]
是否为回文串
因此也可以考虑动态规划
代码
class Solution {
public:
int minCut(string s) {
int n = s.size();
vector<int> f(n+1,INT_MAX);
vector<vector<bool>> isPalindrome(n, vector<bool>(n, false));
//倒着遍历i
//子问题isPalindrome[i + 1][j - 1]已经更新过
for (int i = n - 1; i >= 0; --i) {
for (int j = i; j < n; ++j) {
if (s[i] == s[j] && (j - i < 2 || isPalindrome[i + 1][j - 1])) {
isPalindrome[i][j] = true;
}
}
}
//试出来的
f[0] = -1;
//动态规划
for(int i=0;i<n;i++){
for(int j=i;j>=0;j--){
if(f[j] < INT_MAX && isPalindrome[j][i]){
f[i+1] = min(f[i+1],f[j] + 1);
}
}
}
return f[n];
}
};