题目
https://leetcode-cn.com/problems/palindrome-partitioning-ii/
动态规化
需要进行两次动态规化,第一次动态规化计算f[i][j],也就是s[i, j]是否是回文串。
第二次动态规化设置g[i]代表s[0, i]的最小分割次数,如果s[0, i]是回文串,则g[i] = 0, 如果不是回文串则 g[i] = g[j] + 1, 0 < j < i, s[j +1,i]是回文串。
class Solution {
public int minCut(String s) {
int n = s.length();
boolean[][] g = new boolean[n][n];
for (int i = 0; i < n; ++i) {
Arrays.fill(g[i], true);
}
for (int i = n - 1; i >= 0; --i) {
for (int j = i + 1; j < n; ++j) {
g[i][j] = s.charAt(i) == s.charAt(j) && g[i + 1][j - 1];
}
}
int[] f = new int[n];
Arrays.fill(f, Integer.MAX_VALUE);
for (int i = 0; i < n; ++i) {
if (g[0][i]) {
f[i] = 0;
} else {
for (int j = 0; j < i; ++j) {
if (g[j + 1][i]) {
f[i] = Math.min(f[i], f[j] + 1);
}
}
}
}
return f[n - 1];
}
}