Leetcode - 392
此题按照bool型dp数组去做,dp[i][j]定义为以s[i-1]为结尾的s的子串 是否是 以t[j-1]为结尾的t的子串的子序列。
递推关系: 若s[i-1] == t[j-1]时。 先判断dp[i-1][j-1]是否为True,若为True,则表明前面都是符合条件的,此时dp[i][j] = True.
若不等时,s删除一个字符,判断以s[i-2]结尾的串 是否是以t[j-1]结尾的串的子序列的结果 作为dp[i][j]的结果。(s保持不变,t增长1,这是最好的匹配结果)
def isSubsequence(self, s: str, t: str) -> bool:
dp = [[False for _ in range(len(t)+1)] for _ in range(len(s)+1)]
# “”是“”的子序列
dp[0][0] = True
# “”任何时候是t的子串的子序列,但是s的子串肯定不是“”的子序列
for i in range(1,len(t)+1):
dp[0][i] = True
for i in range(1,len(s)+1):
for j in range(1,len(t)+1):
if s[i-1] == t[j-1]:
if dp[i-1][j-1] == True:
dp[i][j] = True
else:
dp[i][j] = dp[i][j-1]
return dp[-1][-1]
Leetcode - 115
dp[i][j]代表以s[i-1]为结尾的s的子串中出现了几次以t[j-1]为结尾的t的子串。
初始化:dp[0][0],"" 中出现了一次"",所以dp[0][0] = 1, dp[0][j] 肯定均为0,
dp[i][0],s的子串中均出现了一次"",所以值均为1
递推关系: 若s[i-1] == t[j-1], 此时要分两种情况讨论,1:使用s[i-1],此时的值就是dp[i-1][j-1],因为只是多增添了一对相等的字符,结果数目不会改变。2: 不使用s[i-1],也就是用以s[i-2]结尾的串去计算以t[j-1]结尾的串在其中出现了几次。 dp[i-1][j]
综上 dp[i][j] = dp[i-1][j-1] + dp[i-1][j], 若s[i-1] ≠ t[j-1],那么就是以s[i-1]结尾的串中出现了几次以t[j-2]结尾的串(即t删除一个字符可取得最大值)为dp[i][j]的值
def numDistinct(self, s: str, t: str) -> int:
dp = [[0 for _ in range(len(t)+1)] for _ in range(len(s)+1)]
dp[0][0] = 1
for i in range(1,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[-1][-1]