1. dp
设dp[i]
是以s[i]
为结尾的子串的最少分割次数,则
dp[i] = min(dp[j-1]+1)
,j
是i
左侧的位置,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]; } };
|