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]+1else: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] = 1for 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]的情况