cms监控软件电脑版官方下载上海优化seo
力扣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];}
};