题意:
思路:
双动态规划
class Solution {
public int minCut(String s) {
//找出s中每个字符的最长回文串 即用动态规划的方法 i j 之间是否为true
if(s==null || s.length()<=1) return 0;
int n=s.length();
boolean[][] dp=new boolean[n][n];
for(int i=0;i<n;i++) dp[i][i]=true;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(s.charAt(i)==s.charAt(j) && ((j+1)==i || dp[i-1][j+1])) dp[i][j]=true;
}
}
//寻找dp[i][j] 之间 确定了 i 和 j之间是否存在回文子串
//那么我们求出最长的回文子串
//下面又是一个动态规划
int[] flag=new int[n];
Arrays.fill(flag,Integer.MAX_VALUE);
for(int i=0;i<n;i++){
if(dp[i][0]){
flag[i]=0;
}else{
for(int j=0;j<i;j++){
if(dp[i][j+1]) flag[i]=Math.min(flag[i],flag[j]+1);
}
}
}
return flag[n-1];
}
}