给定一个字符串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));
}
}