小红拿到了一个仅由数字字符组成的字符串。她准备选择一个非空子序列,使得该子序列中不包含连续的"61"子串。 小红想知道,有多少种不同的子序列选择方式?答案对 1 0 9 + 7 10 9 +7取模。
时间: 2024-02-28 13:57:49 浏览: 95
7种方法,统计字符串中“子字符串”的个数
5星 · 资源好评率100%
这是一个比较典型的动态规划问题,可以用 dp[i] 表示以第 i 个字符结尾的不包含连续的 "61" 子串的子序列个数。那么对于第 i 个字符,它可以单独作为一个子序列,则 dp[i] = (dp[i-1] + 1) % 1000000007;也可以跟前面的字符组成一个子序列,则需要找到满足条件的最近的 "6" 的位置 j,那么 dp[i] = (dp[i-1] + dp[j-1]) % 1000000007。最终答案是所有 dp[i] 的和对 1000000007 取模。
下面是实现该算法的 Python 代码:
```
MOD = 1000000007
s = input().strip()
n = len(s)
dp = [0] * (n+1)
last_six = [-1] * 10 # 记录最近的 6 的位置
for i in range(1, n+1):
dp[i] = (dp[i-1] + 1) % MOD
if s[i-1] == '1' and last_six[int(s[i-2])] != -1:
j = last_six[int(s[i-2])]
dp[i] = (dp[i] + dp[j-1]) % MOD
if s[i-1] == '6':
last_six[int(s[i-2])] = i
ans = 0
for i in range(1, n+1):
ans = (ans + dp[i]) % MOD
print(ans)
```
阅读全文