132. 分割回文串 II
怎么用確定
f[i][j]區(qū)間是否是回文串

左端點從最右往左遍歷,固定左端點,右端點從左往右
for (int i = n - 1; i >= 0; --i) {
for (int j = i + 1; j < n; ++j) {
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
}
}
我注釋里寫的這個是不行的
// for (int i = 0; i < n; i++) {
// for (int j = i + 1; j < n; j++) {
// f[i][j] = f[i + 1][j - 1] && s[i] == s[j];
// }
// }
必須從小區(qū)間到大區(qū)間,這樣才能保證計算f[i][j]的時候f[i+1][j-1]被算過了
我這種寫法上來就是算了最長的區(qū)間i=0~j=n-1,實際上中間f[i+1][j-1]是沒有被計算過的
固定右端點(從左往右),左端點從右往左也是可以的
for (int j = 1; j < n; j++) {
for (int i = j - 1; i >= 0; i--) {
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
}
}
class Solution {
public:
int minCut(string s) {
int n = s.size();
int f[n][n];
memset(f, true, sizeof f);
// for (int i = 0; i < n; i++) {
// for (int j = i + 1; j < n; j++) {
// f[i][j] = f[i + 1][j - 1] && s[i] == s[j];
// }
// }
for (int i = n - 1; i >= 0; --i) {
for (int j = i + 1; j < n; ++j) {
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
}
}
int dp[n];
memset(dp, 0x3f, sizeof dp);
for (int i = 0; i < n; i++) {
if (f[0][i]) dp[i] = 0;
for (int j = 0; j < i; j++) {
if (f[j + 1][i])dp[i] = min(dp[i], dp[j] + 1);
}
}
return dp[n - 1];
}
};