<pre name="code" class="java"> cut[i]记录i到end的最小切割数 matrix[i][j]记录从i到j的子串是否是回文串
public class PalindromePartitioning2 {
public int minCut(String s) {
if (s == null)
return 0;
int length = s.length();
int[] cut = new int[length];
Boolean[][] matrix = new Boolean[length][length];
for (int i = 0; i < length; i++) {
cut[i] = length - i - 1;
}
matrix[length - 1][length - 1] = true;
for (int i = length - 1; i >= 0; i--) {
for (int j = i; j < length; j++) {
if (i == j)
matrix[i][j] = true;
else if (j - i == 1) {
if (s.charAt(i) == s.charAt(j)) {
matrix[i][j] = true;
} else
matrix[i][j] = false;
} else {
if (matrix[i + 1][j - 1] && (s.charAt(i) == s.charAt(j))) {
matrix[i][j] = true;
} else
matrix[i][j] = false;
}
if (j < length - 1 && matrix[i][j] && cut[i] > (cut[j + 1] + 1)) {
cut[i] = cut[j + 1] + 1;
} else if (j == length - 1 && matrix[i][j])
cut[i] = 0;
}
}
return cut[0];
}
public static void main(String[] args) {
PalindromePartitioning2 test = new PalindromePartitioning2();
int min = test.minCut("aabc");
System.out.println(min);
}
}