1. 程式人生 > >字串切分成迴文子串所需的最少切分次數。

字串切分成迴文子串所需的最少切分次數。

題目描述:給定一個字串,計算出將該字串切分成若干個迴文子串所需的最少切分次數

思路:使用動態規劃,每一次DP,從i向右掃描,每找到一個迴文串就算一次DP的話,就可以轉換為f[i]在區間[i,n-1]之間最小的切分數量。

狀態轉移方程:f(i) = min{f(j+1)+1,f(j)};

判斷是否是迴文串:也是使用DP,前面部落格介紹過關於相關回文串的解法,這裡不再詳解

圖示分析:

 

程式碼:

 1 /**
 2  * 動態規劃實現:切割字串使得每一個子串為迴文字串,所需要的最少切割次數
 3  *
 4  */
 5 public class Test7 {
 6
7 static String str = "aabbab"; 8 public static void main(String[] args) { 9 System.out.println(minCut(str)); 10 } 11 12 static int minCut(String str) { 13 int len = str.length(); 14 int[] f = new int[len+1]; //最小分割的陣列 15 int[][] dp = new int[len][len]; //
動態規劃實現迴文字串判斷 16 /* 17 * 初始化最壞情況 每一個字串都作為單獨的一個字串作為迴文字串 這個時候f[0] = n-1-0 18 * 需要n-1次切割 後續相同 19 */ 20 for (int i = 0; i <= len; i++) { 21 f[i] = len - 1 -i; 22 } 23 for (int i = len - 1; i >= 0; i--) { 24 dp[i][i] = 1;
25 for (int j = i; j < len; j++) { 26 if(str.charAt(i) == str.charAt(j) && ((j - i < 2) || dp[i+1][j-1] == 1)) { 27 dp[i][j] = 1; 28 f[i] = Math.min(f[i], f[j+1]+1); 29 } 30 } 31 } 32 return f[0]; 33 } 34 }