主要内容
子序列问题
动态规划题目
392.判断子序列
思路分析
if t[i - 1] == s[j - 1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = dp[i-1][j]
如果不相等,只需要看t的前一位,以为最终目的是看t是否包含整个s,就无需看s的前一位了
代码
class Solution:
# 第一想法是用动态规划计算二者的最长公共子序列长度是否等于len(s)
# dp[i][j]指的是以s[i-1] t[j-1]结尾的最长公共子序列的长度
def isSubsequence(self, s: str, t: str) -> bool:
m, n = len(s), len(t)
if m == 0:
return True
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
if t[i - 1] == s[j - 1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = dp[i-1][j]
if dp[i][j] == m:
return True
return False
115.不同的子序列
思路分析
代码
class Solution:
# dp[i][j]表示 以 s[i-1]结尾的子序列 中 包含 以 t[j-1]结尾的子序列的个数
# 递推公式:
# if s[i-1] == t[j-1] : 需考虑两部分 用s[i-1]做匹配 + 不用s[i-1]做匹配
# else:不用 s[i-1]做匹配
# 初始化 dp[i][0] = 1 ,dp[0][j]=0, dp[0][0] = 1
def numDistinct(self, s: str, t: str) -> int:
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[-1][-1]