📅  最后修改于: 2023-12-03 15:11:39.753000             🧑  作者: Mango
给定一个字符串,计算其中“GFG”子序列出现的次数。
使用动态规划算法解决该问题。
定义一个二维数组 dp[i][j]
表示在字符串的前 i
个字符中,“GFG”子序列出现了 j
次的方案数。
对于字符串中的每个字符,考虑以下两种情况:
i-1
个字符中的数量相同,即 dp[i][j] = dp[i-1][j]
。i-1
个字符中“GF”子序列的数量,即 dp[i][j] += dp[i-1][j-1]
。i-1
个字符中“G”子序列的数量,即 dp[i][j] += dp[i-1][j]
。i-1
个字符中的总子序列数,即 dp[i][j] += dp[i-1][j]
。最后,目标值为 dp[n][3]
即为字符串中“GFG”子序列出现的次数。
def count_gfg(s: str) -> int:
n = len(s)
dp = [[0] * 4 for _ in range(n + 1)]
dp[0][0] = 1
for i in range(1, n + 1):
for j in range(4):
dp[i][j] = dp[i-1][j]
if j > 0 and s[i-1] == 'G' and j <= 2:
dp[i][j] += dp[i-1][j-1]
elif s[i-1] == 'F' and j <= 3:
dp[i][j] += dp[i-1][j-1]
elif s[i-1] == 'G' and j == 0:
dp[i][j] += dp[i-1][j]
return dp[n][3]
代码中 dp[i][j]
表示的是前 i
个字符中“GFG”子序列出现了 j
次的方案数。其中,dp[0][0] = 1
表示初始状态为没有任何字符时,“GFG”子序列出现了 0 次,只有一种方案。
对于每个字符,依次更新 dp[i][j]
的值,最终返回 dp[n][3]
即为所求。
该算法中需要遍历一遍字符串,时间复杂度为 $O(n)$。
由于需要开辟一个二维数组,空间复杂度为 $O(n)$。
本文介绍了如何使用动态规划算法计算字符串中“GFG”子序列出现的次数。
相信通过本文的学习,您已经对动态规划有了更深入的了解。在实际编程中,本文提到的算法可以应用于计算其它子序列的数量,希望本文的内容能够对您有所帮助。