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] 是否为回文字符串
// 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 (j - i <= 2) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
}
}

// 定义 g[i] 为子字符串 s[0, i] 的最少分割次数
int[] g = new int[n];
for (int i = 0; i < n; i++) {
if (dp[0][i]) {
g[i] = 0;
} else {
g[i] = i;
// [0, j] / [j + 1, 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];
}
}

References

132. Palindrome Partitioning II
剑指 Offer II 094. 最少回文分割