2472. Maximum Number of Non-overlapping Palindrome Substrings
SourceWeekly Contest 319 Q4DifficultyHardRating2013
Description
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 least
k. - 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 <= 2000sconsists of lowercase English letters.
Solutions
Solution 1: Preprocessing + Dynamic Programming
Thinking
We want as many non-overlapping palindromes of length at least \(k\) as possible. With \(n \le 2000\), enumerating partitions is too slow. Whether \(s[i..j]\) is a palindrome can be precomputed in \(O(n^2)\) as \(g[i][j]\). The remaining choice at index \(i\) is to skip \(s[i]\), or take a palindrome starting at \(i\) with length at least \(k\) and continue after its right end. Filling \(f[i]\) from the right makes each transition look only at larger indices.
First, preprocess the string \(s\) to get \(g[i][j]\), which represents whether the substring \(s[i..j]\) is a palindrome.
Then, define \(f[i]\) as the maximum number of non-overlapping palindrome substrings that can be selected from \(s[i..]\). Initially, \(f[n] = 0\). For \(i\) from \(n - 1\) down to \(0\), we can skip \(s[i]\), i.e., \(f[i] = f[i + 1]\); we can also enumerate the ending index \(j\) (\(j \ge i + k - 1\)), and if \(g[i][j]\) is true, we take this palindrome and continue from \(j + 1\). That is,
The time complexity is \(O(n^2)\), and the space complexity is \(O(n^2)\). Here, \(n\) is the length of the string \(s\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
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 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |