392. 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:def isSubsequence(self, s: str, t: str) -> bool:len1 = len(s)len2 = len(t)if len2<len1:return False# dp[i][j] means string s ends with i-1 # AND string t ends with j-1 has same subsequence length dp[i][j]dp = [[0]*(len2+1) for _ in range(len1+1)]for i in range(1,len1+1):charS = s[i-1]for j in range(1,len2+1):charT = t[j-1]if charS == charT:dp[i][j] = dp[i-1][j-1] +1else: # 相当于t要删除元素 继续匹配;删除t[j-1] 等同于s[i-1]与t[j-2]比较结果dp[i][j] = dp[i][j-1]return dp[len1][len2] == len1
115. 不同的子序列
给你两个字符串
s
和t
,统计并返回在s
的 子序列 中t
出现的个数。题目数据保证答案符合 32 位带符号整数范围。
class Solution:def numDistinct(self, s: str, t: str) -> int:len1 = len(s)len2 = len(t)# 以i-1结尾的s子序列出现在以j-1结尾的t的个数为dp[i][j]dp = [[0 for _ in range(len2+1)] for _ in range(len1+1)]# s[i - 1] 与 t[j - 1]相等,dp[i][j]由两部分组成# 1. 需要s[i - 1]匹配,那么个数为dp[i-1][j-1]# 2. 不需要s[i - 1]匹配,那么个数为dp[i-1][j] {bagg,bag} s[2]==t[2]但不一定要使用s[2]也可以用s[3]# s[i - 1] 与 t[j - 1] 不相等, dp[i][j]由一部分组成# 1.不需要s[i - 1]匹配,那么个数为dp[i-1][j]# dp[i][0] 意味着s[i-1]中空字符串的个数 为1for i in range(len1+1):dp[i][0] = 1# dp[0][j] 意味着空字符串中[j-1]的个数 为0for j in range(len2+1):dp[0][j] = 0# 注意dp[0][0] =1# 空字符串可以删除0个元素变成空字符串dp[0][0] = 1# 遍历顺序 从上到下 从左到右for i in range(1,len1+1):for j in range(1,len2+1):charS = s[i-1]charT = t[j-1]if charS == charT:dp[i][j] = dp[i-1][j-1] + dp[i-1][j]else:dp[i][j] = dp[i-1][j]return dp[len1][len2]