
提交的代码: 17 小时前
语言: python3添加备注class Solution:def beautifulPartitions(self, s: str, k: int, minLength: int) -> int:MOD = 10 ** 9 + 7n = len(s)primes = {'2', '3', '5', '7'}if s[0] not in primes or s[-1] in primes:return 0if k == 1:return int(s[0] in primes and s[-1] not in primes and len(s) >= minLength)# 可能的结束点j, 0 <= j < n - 1, j非质数 j + 1质数end_points = []for j, v in enumerate(s):if j < n - 1:if s[j] not in primes and s[j + 1] in primes:end_points.append(j)#print(end_points)x = end_pointsm = len(end_points)if m < k - 1:return 0# 0 <= x1 < x2 < ... < xm <= n - 1 选k - 1个点# 不妨设为b1, b2, ... b(k - 1), 满足# 1.b1 + 1 >= minLength# 2.bi - b(i - 1) >= minLength, i belongs to [1, k - 1]# 3.n - 1 - b(k - 1) >= minLength# dp[i][j]表示第i个结束点作为第j个结束段点的个数# dp[i][k]求和,其中n - 1 - x[i] >= minLengthdp = [[0] * (k - 1) for _ in range(m)]col_preSum = [[0] * (k - 1) for _ in range(m)] # 每列的前缀和优化for i in range(m): #initif x[i] + 1 >= minLength:#print(i, k, m)dp[i][0] = 1if i == 0:col_preSum[i][0] = dp[i][0]else:col_preSum[i][0] = col_preSum[i - 1][0] + dp[i][0]# 20221120我觉得大概能做出来把for i in range(m):for j in range(1, k - 1):# 本质上是一个j - 1列的前缀和# for i2 in range(i):# if x[i] - x[i2] >= minLength:# dp[i][j] += dp[i2][j - 1]# dp[i][j] %= MODcheck_point = x[i] - minLengthi2 = bisect_right(x, check_point)if i2 == 0: # 找不到dp[i][j] == 0else: # 找到dp[i][j] += col_preSum[i2 - 1][j - 1]if i == 0:col_preSum[i][j] = dp[i][j]else:col_preSum[i][j] = col_preSum[i - 1][j] + dp[i][j]ans = 0for i in range(m):if n - 1 - x[i] >= minLength:ans += dp[i][-1]ans %= MODreturn ans % MOD
下一篇:艳的反义词是什么