|
1 |
| -function numberOfCombinations( num) { |
2 |
| - let dp = Array(3501).fill(0), dpp=Array(3501).fill(0), pf=Array(3501).fill(0), n = num.length, mod = 1000000007; |
| 1 | +/** |
| 2 | + * @param {string} num |
| 3 | + * @return {number} |
| 4 | + */ |
| 5 | +function numberOfCombinations(num) { |
| 6 | + let dpArr = Array(3501).fill(0), |
| 7 | + dp = Array(3501).fill(0), |
| 8 | + prefix = Array(3501).fill(0), |
| 9 | + n = num.length, |
| 10 | + mod = 1e9 + 7 |
3 | 11 | for (let l = 1; l <= n; ++l) {
|
4 |
| - dpp[0] = 1; |
5 |
| - for (let i = n; i - l > 0; --i) |
6 |
| - pf[i - 1] = num[i - 1 - l] == num[i - 1] ? pf[i] + 1 : 0; |
7 |
| - for (let i = 0; i < n; ++i) { |
8 |
| - dp[i + 1] = dpp[i + 1]; |
9 |
| - if (l <= i + 1 && num[i + 1 - l] != '0') { |
10 |
| - if (i + 1 - 2 * l >= 0 && (pf[i + 1 - l] >= l || num[i + 1 - l + pf[i + 1 - l]] > num[i + 1 - 2 * l + pf[i + 1 - l]])) |
11 |
| - dp[i + 1] = (dp[i + 1] + dp[i + 1 - l]) % mod; |
12 |
| - else |
13 |
| - dp[i + 1] = (dp[i + 1] + dpp[i + 1 - l]) % mod; |
14 |
| - } |
| 12 | + dp[0] = 1 |
| 13 | + for (let i = n; i - l > 0; --i) |
| 14 | + prefix[i - 1] = num[i - 1 - l] === num[i - 1] ? prefix[i] + 1 : 0 |
| 15 | + for (let i = 0; i < n; ++i) { |
| 16 | + dpArr[i + 1] = dp[i + 1] |
| 17 | + if (l <= i + 1 && num[i + 1 - l] != '0') { |
| 18 | + if ( |
| 19 | + i + 1 - 2 * l >= 0 && |
| 20 | + (prefix[i + 1 - l] >= l || |
| 21 | + num[i + 1 - l + prefix[i + 1 - l]] > num[i + 1 - 2 * l + prefix[i + 1 - l]]) |
| 22 | + ) |
| 23 | + dpArr[i + 1] = (dpArr[i + 1] + dpArr[i + 1 - l]) % mod |
| 24 | + else dpArr[i + 1] = (dpArr[i + 1] + dp[i + 1 - l]) % mod |
15 | 25 | }
|
16 |
| - let tmp = dpp |
17 |
| - dpp = dp |
18 |
| - dp = tmp |
19 |
| - } |
20 |
| - return dpp[n]; |
| 26 | + } |
| 27 | + const tmp = dp |
| 28 | + dp = dpArr |
| 29 | + dpArr = tmp |
| 30 | + } |
| 31 | + return dp[n] |
21 | 32 | }
|
0 commit comments