跳到主要内容

2472.不重叠回文子字符串的最大数目

链接:2472.不重叠回文子字符串的最大数目
难度:Hard
标签:字符串、动态规划
简介:返回最优方案中能选择的子字符串的 最大 数目。

题解 1 - cpp

  • 编辑时间:2022-11-13
  • 执行用时:44ms
  • 内存消耗:6.6MB
  • 编程语言:cpp
  • 解法介绍:dp[i]表示存在 i 个字符的时候最大回文个数。
class Solution {
public:
string s;
int n;
int maxPalindromes(string s, int k) {
this->s = s;
n = s.size();
vector<int> dp(n + 1, 0);
for (int i = 0; i < n; i++) {
check(dp, k, i, i);
check(dp, k, i, i + 1);
}
return dp[n];
}
void check(vector<int> &dp, int k, int l, int r) {
dp[l + 1] = max(dp[l + 1], dp[l]);
for (; l >= 0 && r < n && s[l] == s[r]; l--, r++) {
if (r - l + 1 >= k) dp[r + 1] = max(dp[r + 1], dp[l] + 1);
}
}
};

题解 2 - cpp

  • 编辑时间:2022-11-13
  • 执行用时:40ms
  • 内存消耗:6.5MB
  • 编程语言:cpp
  • 解法介绍:方便获取 l 和 r。
class Solution {
public:
int maxPalindromes(string s, int k) {
int n = s.size();
vector<int> dp(n + 1, 0);
for (int i = 0; i < 2 * n - 1; i++) {
int l = i / 2, r = l + i % 2;
dp[l + 1] = max(dp[l + 1], dp[l]);
for (; l >= 0 && r < n && s[l] == s[r]; l--, r++) {
if (r - l + 1 >= k) dp[r + 1] = max(dp[r + 1], dp[l] + 1);
}
}
return dp[n];
}
};