You are given a string s and a positive integer k.
Select a set of non-overlapping substrings from the string s that satisfy the following conditions:
The length of each substring is at leastk.
Each substring is a palindrome.
Return the maximum number of substrings in an optimal selection.
A substring is a contiguous sequence of characters within a string.
Example 1:
Input: s = "abaccdbbd", k = 3
Output: 2
Explanation: We can select the substrings underlined in s = "abaccdbbd". Both "aba" and "dbbd" are palindromes and have a length of at least k = 3.
It can be shown that we cannot find a selection with more than two valid substrings.
Example 2:
Input: s = "adbcda", k = 2
Output: 0
Explanation: There is no palindrome substring of length at least 2 in the string.
Constraints:
1 <= k <= s.length <= 2000
s consists of lowercase English letters.
Solutions
Solution 1: Preprocessing + Memoization Search
First, preprocess the string \(s\) to get \(dp[i][j]\), which represents whether the substring \(s[i,..j]\) is a palindrome.
Then, define a function \(dfs(i)\) to represent the maximum number of non-overlapping palindrome substrings that can be selected from the substring \(s[i,..]\), i.e.,
\[
\begin{aligned}
dfs(i) &= \begin{cases}
0, & i \geq n \\
\max\{dfs(i + 1), \max_{j \geq i + k - 1} \{dfs(j + 1) + 1\}\}, & i < n
\end{cases}
\end{aligned}
\]
The time complexity is \(O(n^2)\), and the space complexity is \(O(n^2)\). Here, \(n\) is the length of the string \(s\).