https://oj.leetcode.com/problems/palindrome-partitioning-ii/
给定一个串,让把它划分成子串,要求每个子串都是回文的。
动态规划:
设数组 ans(i)表示从0到 i 要经过的最小划分数,则
ans[i] = ans[k] + 1,如果 k 到 i 是回文的
i - 1 ,如果 k 到 i 都不是回文的
class Solution{ public: int minCut(string s) { const int n = s.size(); vector<int> ans; ans.resize(n+1); vector<vector<bool> > isPal; isPal.resize(n); for(int i = 0;i<n;i++) isPal[i].resize(n); for(int i = 0;i<=n;i++) { ans[i] = n - 1 - i; } for(int i = n-1;i>=0;i--) for(int j = i; j<n;j++) { if(s[i] == s[j] &&(j-i<2 || isPal[i+1][j-1])) { isPal[i][j] = true; ans[i] = min(ans[i],ans[j+1]+1); } } return ans[0]; } };