分割回文串 II
题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
解题思路:首先创建一个数组存储i到j是否是回文串,之后再用动态规划进行最少分割次数的求解
class Solution {
public int minCut(String s) {
if(s == null)
return 0;
if(s.isEmpty())
return 1;
char ch[] = s.toCharArray();
int len = ch.length;
//isPail[i][j]表示i到j是否为回文串
boolean isPail[][] = new boolean[len][len];
for(int i = 0; i < len; i++) {
for(int j = 0; j <= i; j++) {
isPail[j][i] = check(ch, j, i);
// System.out.println("i = " + i + ", j = " + j + ", dp = " + isPail[j][i]);
}
}
//数组定义: dp[i]表示 0到i - 1的最少回文串个数
int dp[] = new int[len + 1];
dp[0] = 0;
/**
状态方程:if(isPail[j][i - 1]) dp[i] = min(dp[i], dp[j] + 1)
**/
for(int i = 1; i <= len; i++) {
dp[i] = Integer.MAX_VALUE;
for(int j = 0; j < i; j++) {
if(isPail[j][i - 1]) {
dp[i] = Math.min(dp[i], dp[j] + 1);
}
}
}
//分割次数 = 回文串个数 - 1
return dp[len] - 1;
}
//判断是否为回文串
private boolean check(char[] ch, int l, int r) {
int i = l, j = r;
while(i < j && ch[i] == ch[j]) {
i++;
j--;
}
return i >= j;
}
}