字符串 APPAPT 中共包含两个 PAT 作为子串。
第一个子串由第二,第四和第六个字符组成,第二个子串由第三,第四和第六个字符组成。
现在给定一个字符串,请你求出字符串中包含的 PAT 的数量。
输入格式
共一行,包含一个由大写字母 P,A,T 构成的字符串。
输出格式
输出字符串中包含的 PAT 的数量。
由于结果可能很大,请你输出对 1000000007 取模后的结果。
数据范围
给定字符串的长度不超过 105。
输入样例:
APPAPT
输出样例:
2
题解
状态机模型
S[] = “APPAPT”
P[] = “PAT”
根据P[]定义四种状态:0,1,2,3
最后答案就是可以到达3的状态方案数。
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])