392、判断子序列:
class Solution(object):
def isSubsequence(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]
for i in range(1, len(s)+1):
for j in range(1, len(t)+1):
if s[i-1] == t[j-1]:
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = dp[i][j-1]
return dp[len(s)][len(t)] == len(s)
本题实际上是最长公共子序列的变种,唯一不同点在于,判断s是否为t的子序列,s[i-1]和t[j-1]不相等时,只需要传递dp[i][j-1]的值即可
115、不同的子序列:
class Solution(object):
def numDistinct(self, s, t):
"""
:type s: str
:type t: str
:rtype: int
"""
dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]
for i in range(len(s)+1):
dp[i][0] = 1
for i in range(1, len(s)+1):
for j in range(1, len(t)+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[len(s)][len(t)]
dp数组定义为i-1结尾的s中包含的j-1结尾的t的个数,递推公式推导过程中,需要考虑s[i-2]和s[i-1]相等的情况,即可以使用s[i-1],也可以不使用s[i-1]的情况