import java.util.*; /** * 思路: 动态规划 * 问题: 求将s分割为每一段都是回文串的的最小分割数 * 子问题: 将s的一部分分割为回文串的次数 * 状态: 将s的前i个字符分割为回文串的最小次数 * 分析: 举例 aab, 初始状态1个字符的时候不需要分割, F[1] = 0, F[2] = 0(已经是回文串), F[3]=min(F[j])+1 * 状态转移方程: * 1. 已经是回文串 F[i]=0 * 2. if(j<i && s[j+1,i]是回文串) F[i] = min(F[j])+1 */ public class Solution { public boolean isPal(String s, int start, int end){ while(start<end){ if(s.charAt(start) != s.charAt(end)) { return false; } start++; end--; } return true; } public int minCut (String s) { if(s.length() == 0) return 0; int []minc = new int[s.length()+1]; int len = s.length(); for(int i=1; i<=len;i++){ minc[i] = i-1; } for(int i=2; i<=len; i++){ if(isPal(s, 0, i-1)) { minc[i] = 0; continue; } for(int j=0; j<i; j++){ if(isPal(s, j, i-1)){ minc[i] = Math.min(minc[j]+1, minc[i]); } } } return minc[len]; } }