class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
# dp[i][j] 以i-1结尾的s和以j - 1结尾的t的最长公共子序列长度
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[-1][-1] == len(s)
本题和昨天的1143 最长公共子序列的共同点在于都是求公共子序列的长度,不同的在于当s[i - 1]和t[j - 1]不相等的时候,不用去考虑dp[i - 1]的情况,因为本题最终要判断s是不是t的子序列,s里面不删除元素。
复习一下回溯
class Solution:
def numDistinct(self, s: str, t: str) -> int:
def back_tracking(result, subset, s, start_index):
if len(subset) == len(t):
result.append(''.join(subset.copy()))
for i in range(start_index, len(s)):
subset.append(s[i])
back_tracking(result, subset, s, i + 1)
subset.pop()
result = []
subset = []
start_index = 0
back_tracking(result, subset, s, start_index)
index = 0
print(result)
for i in result:
if i == t:
index += 1
return index
统计s所有长度等于t的长度的子集,统计一下t在子集中出现了多少次。
意料之中超时了
动规,还是有点难想
class Solution:
def numDistinct(self, s: str, t: str) -> int:
# dp: 以i-1为结尾的s的子串中有以j-1为结尾的t的个数
dp = [[0] * (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 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]