Poison

132. Palindrome Partitioning II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public int minCut(String s) {
int n = s.length();

// 定义 dp[i][j] 为 s[i, j] 是否为回文串,潜在条件:j >= i, dp[i][j] depends on dp[i + 1][j - 1]
boolean[][] dp = new boolean[n][n];
for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (s.charAt(i) == s.charAt(j)) {
if (i + 1 >= j - 1) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
}
}

// 定义 g[i] 为 s[0, i] 字符串分割为回文字符串的最小次数
int[] g = new int[n];
g[0] = 0;

for (int i = 1; i < n; i++) {
if (dp[0][i]) {
g[i] = 0;
} else {
g[i] = i;
for (int j = 0; j < i; j++) {
if (dp[j + 1][i]) {
g[i] = Math.min(g[i], g[j] + 1);
}
}
}
}

return g[n - 1];
}
}
Reference

132. Palindrome Partitioning II