欢迎访问我的博客首页。
力扣 101 至 150 困难
1. LeetCode 132.分割回文串Ⅱ
class Solution {
public:
int minCut(string& str) {
if (str.size() < 2)
return 0;
// 1.找出所有回文子串。
int N = str.size();
vector<vector<int>> dp(N, vector<int>(N));
for (int start = N - 1; start >= 0; start--) {
for (int end = start; end < N; end++) {
if (start == end)
dp[start][end] = 1;
else if (str[start] == str[end] && dp[start + 1][end - 1] == end - start - 1)
dp[start][end] = dp[start + 1][end - 1] + 2;
}
}
// 2.分割。
vector<int> minCut(N);
// 2.1最多的分割方法。
for (int i = 0; i < N; i++)
minCut[i] = i + 1;
// 2.2推导。
for (int gap = 0; gap < N; gap++) {
for (int start = 0; start <= gap; start++) {
if (dp[start][gap] == 0)
continue;
if (start == 0)
minCut[gap] = 0;
else
minCut[gap] = min(minCut[gap], minCut[start - 1] + 1);
}
}
return minCut[N - 1];
}
};
我们申请的 minCut 长度和原字符串 str 相同。minCut[0] 表示在 str[0] 后面的间隙切断。