//时间复杂度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];
}
}