给定一个字符串s,将s分割成一些子串,使每个子串都是回文。
返回s符合要求的的最少分割次数。
样例
比如,给出字符串s = "aab",
返回s符合要求的的最少分割次数。
样例
比如,给出字符串s = "aab",
返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串
import java.util.Scanner; /** * 给定一个字符串s,将s分割成一些子串,使每个子串都是回文。 返回s符合要求的的最少分割次数。 样例 比如,给出字符串s = "aab", 返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串 * * @author Dell * */ public class Test108 { public static int minCut(String s) { if(s.equals("")||s==null) return 0; int len=s.length(); boolean[][] ishuiwen=new boolean[len][len]; for(int L=1;L<=len;L++) { for(int i=0;i<len-L+1;i++) { int j=i+L-1; if(L==1) { ishuiwen[i][j]=true; } else if(L==2) { if(s.charAt(i)==s.charAt(j)) ishuiwen[i][j]=true; } else { if(s.charAt(i)==s.charAt(j)&&ishuiwen[i+1][j-1]) ishuiwen[i][j]=true; } } } int[] dp=new int[len]; for(int i=len-1;i>=0;i--) { if(ishuiwen[i][len-1]) { dp[i]=0; continue; } dp[i]=Integer.MAX_VALUE; for(int j=i+1;j<len;j++) { if(ishuiwen[i][j-1]&&dp[i]>dp[j]+1) { dp[i]=dp[j]+1; } } } return dp[0]; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); String s=sc.nextLine(); System.out.println(minCut(s)); } }