📜  门| GATE-CS-2015(套装3)|第 54 题(1)

📅  最后修改于: 2023-12-03 14:58:30.504000             🧑  作者: Mango

题目描述

本题目是GATE-CS-2015(套装3)的第54题。题目需要求解一个特定的问题,需要程序员使用自己的技能和经验进行设计和实现。

问题描述

你被要求编写一个函数,其输入为两个字符串s和t,函数返回s的子序列中t的出现次数。字符串s和t均由小写字母组成。你需要实现求解的函数。

输入

输入为两个字符串s和t,其中$1 \leq |s| \leq 100$,且$1 \leq |t| \leq 100$。字符串s和t均由小写字母组成。

输出

该题目需要计算的是字符串s的子序列中t的出现次数,你需要实现函数返回这个次数。如果t在s的任何子序列中都没有出现,则返回0。

解题思路

解题思路:本题可以使用动态规划求解。

将动态规划数组定义为$dp[i][j]$,表示字符串s的前i个字母和字符串t的前j个字母所匹配的子序列数量。具体求解状态转移方程如下:

如果$s[i] == t[j]$,$dp[i][j] = dp[i-1][j-1]+dp[i-1][j]$,如果$t[j]$和$s[i]$不相等,$dp[i][j]=dp[i-1][j]$

其中,$dp[0][0] = 1$, $dp[0][1] = 0$,$dp[1][0] = 1$。

最后,动态规划数组中的$dp[|s|][|t|]$ 即为答案。

代码实现

def count_occurrences(s, t):
    m, n = len(s), len(t)
    dp = [[0] * (n+1) for _ in range(m+1)]
    for i in range(m+1):
        dp[i][0] = 1
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s[i-1] == t[j-1]:
                dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
            else:
                dp[i][j] = dp[i-1][j]
    return dp[m][n]
复杂度分析

本题的时间复杂度为 O(|s| * |t|),空间复杂度为 O(|s| * |t|)。