分割回文串II

给定一个字符串s,将s分割成一些子串,使每个子串都是回文。
返回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));
	  
	}

}



猜你喜欢

转载自blog.csdn.net/wwe4023/article/details/76408620