0
点赞
收藏
分享

微信扫一扫

1583. PAT 计数 (状态机DP)


字符串 APPAPT 中共包含两个 PAT 作为子串。

第一个子串由第二,第四和第六个字符组成,第二个子串由第三,第四和第六个字符组成。

现在给定一个字符串,请你求出字符串中包含的 PAT 的数量。

输入格式
共一行,包含一个由大写字母 P,A,T 构成的字符串。

输出格式
输出字符串中包含的 PAT 的数量。

由于结果可能很大,请你输出对 1000000007 取模后的结果。

数据范围
给定字符串的长度不超过 105。

输入样例:
APPAPT
输出样例:
2

题解

状态机模型

S[] = “APPAPT”

P[] = “PAT”

根据P[]定义四种状态:0,1,2,3

1583. PAT 计数 (状态机DP)_算法


最后答案就是可以到达3的状态方案数。

1583. PAT 计数 (状态机DP)_python_02

dp[i][j] 表示只考虑前i个字母并且走到了状态j的所有路线的数量。
dp[i][j]

  • dp[i-1][j] 不选当前字母
  • dp[i-1][j-1] s[i] ==p[j] 选择当前字母

MOD = int(1e9 + 7)
s = input()
s = " " + s

p = " PAT"

f = [[0] * (len(p)) for i in range(len(s))]

f[0][0] = 1
for i in range(1, len(s)):
for j in range(len(p)):
f[i][j] = f[i - 1][j]
if s[i] == p[j]:
f[i][j] = (f[i][j] + f[i - 1][j - 1]) % MOD
print(f[len(s) - 1][len(p) - 1])


举报

相关推荐

0 条评论