0%

132. 分割回文串 II

1. dp

dp[i]是以s[i]为结尾的子串的最少分割次数,则
dp[i] = min(dp[j-1]+1)ji左侧的位置,s[j~i]s[0~i]最后一个回文串。
从后遍历所有的回文串,找到分割最短的。
使用预处理之后,以O(1)的时间判断s[i][j]的回文性。
时间O(n^2),空间O(n^2)

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
class Solution {
public:
int minCut(string s) {
int n = s.length();
vector<vector<bool>> palindromic(n, vector<bool>(n));
vector<int> dp(n, INT_MAX);

for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (j - i < 2)
palindromic[i][j] = s[i] == s[j];
else
palindromic[i][j] = palindromic[i + 1][j - 1] && s[i] == s[j];
}
}

for (int i = 0; i < n; i++) {
if (palindromic[0][i]) {
dp[i] = 0;
continue;
}
for (int j = i; j > 0; j--) {
if (palindromic[j][i])
dp[i] = min(dp[i], dp[j - 1] + 1);
}
}

return dp[n - 1];
}
};