先用区间dp求出每个i,j是否为回文串
然后找出最小的分割次数即可
一个好的做法:
对于求任意区间[i, j]的问题,可以先遍历区间长度,从1开始,一直到n,每次找出dp[i, j] dp[i + 1, j - 1]之间的关系,这样也能遍历所有的区间,
并求出想要的答案
class Solution { public: int vis[2010][2010]; int ans[2010][2010]; int cut(int j, string s) { if(vis[0][j]) { ans[0][j] = 0; return 0; } if(ans[0][j] != -1) return ans[0][j]; int cnt = 9999; for(int i = 1; i <= j; i++) { if(vis[i][j]) { cnt = min(cnt, cut(i - 1, s) + 1); } } ans[0][j] = cnt; return cnt; } int minCut(string s) { memset(vis, -1, sizeof(vis)); memset(ans, -1, sizeof(ans)); int len = s.length(); for(int i = 0; i < len; i++) vis[i][i] = 1; for(int k = 2; k <= len; k++) { for(int i = 0; i + k <= len; i++) { int j = i + k - 1; if(k == 2) vis[i][j] = (s[i] == s[j]); else vis[i][j] = (s[i] == s[j]) && vis[i + 1][j - 1]; } } return cut(len - 1, s); } };