You are given a string s that consists of the digits '1' to '9' and two integers k and minLength.
A partition of s is called beautiful if:
s is partitioned into k non-intersecting substrings.
Each substring has a length of at leastminLength.
Each substring starts with a prime digit and ends with a non-prime digit. Prime digits are '2', '3', '5', and '7', and the rest of the digits are non-prime.
Return the number of beautiful partitions of s. Since the answer may be very large, return it modulo109 + 7.
A substring is a contiguous sequence of characters within a string.
Example 1:
Input: s = "23542185131", k = 3, minLength = 2
Output: 3
Explanation: There exists three ways to create a beautiful partition:
"2354 | 218 | 5131"
"2354 | 21851 | 31"
"2354218 | 51 | 31"
Example 2:
Input: s = "23542185131", k = 3, minLength = 3
Output: 1
Explanation: There exists one way to create a beautiful partition: "2354 | 218 | 5131".
Example 3:
Input: s = "3312958", k = 3, minLength = 1
Output: 1
Explanation: There exists one way to create a beautiful partition: "331 | 29 | 58".
Constraints:
1 <= k, minLength <= s.length <= 1000
s consists of the digits '1' to '9'.
Solutions
Solution 1: Dynamic Programming
We define \(f[i][j]\) as the number of schemes for dividing the first \(i\) characters into \(j\) sections. Initialize \(f[0][0] = 1\), and the rest \(f[i][j] = 0\).
First, we need to determine whether the \(i\)th character can be the last character of the \(j\)th section, it needs to meet the following conditions simultaneously:
The \(i\)th character is a non-prime number;
The \(i+1\)th character is a prime number, or the \(i\)th character is the last character of the entire string.
If the \(i\)th character cannot be the last character of the \(j\)th section, then \(f[i][j]=0\). Otherwise, we have:
\[
f[i][j]=\sum_{t=0}^{i-minLength}f[t][j-1]
\]
That is to say, we need to enumerate which character is the end of the previous section. Here we use the prefix sum array \(g[i][j] = \sum_{t=0}^{i}f[t][j]\) to optimize the time complexity of enumeration.
Then we have:
\[
f[i][j]=g[i-minLength][j-1]
\]
The time complexity is \(O(n \times k)\), and the space complexity is \(O(n \times k)\). Where \(n\) and \(k\) are the length of the string \(s\) and the number of sections to be divided, respectively.