分割回文串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));
	  
	}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章