//时间复杂度O(n^3) public class PalindromeString { //判断回文串 public static boolean isPlind(String s,int start,int end){ while(start<end){ if(s.charAt(start)!=s.charAt(end)){ return false; } start++; end--; } return true; } public static int minCut (String s) { int len=s.length(); int[] mincut=new int[len+1]; if(len==0){ return 0; } //设置初始值,让每个子串的最小分割次数是长度减1 for(int i=1;i<=len;i++){ mincut[i]=i-1; } //遍历字符串,找最小分割次数 for(int i=2;i<=len;i++){//第一个字符的最小切割数就是0,所以从第二个字符开始 //首先需要排除前i个字符是不是回文字符串,如果是那么前i个字符的最小切割次数就是0 if(isPlind(s,0,i-1)){ mincut[i]=0; continue;//跳过这次循环,从低三个字符开始 } //如果不是,那么就需要从第一个字符开始计算 for(int j=1;j<i;j++){ if(isPlind(s,j,i-1)) {//如果从j+1到i-1区间是回文字符串,那么只需要计算前j个字符的最小分割次数 mincut[i] = Math.min(mincut[i], mincut[j] + 1);//整个字符串的最小切割次数就是原来前i个字符的切割次数跟回文串切割次数+1比较的最小值就是整个的结果 } } } return mincut[len]; } }