115. 不同的子序列
知道是DP,但就是找不到递推方程,只好拿递归做,从左遍历,遇到第一个匹配的开始对之后的两个字符串递归,复杂度应该是O(N!),指数级的,第51个用例过不去了。
DP[i] [j]表示由s的前i个元素组成的序列A中有多少由t前j个元素组成的序列B。
首先若s的前i-1序列包含t的前j序列,那么s的前i序列也一定包含t的前j序列。
其次若s[i]==t[j],当s的前i-1序列包含t的前j-1序列时,s的前i序列也包含t的前j序列。
故递推方程:
if s[i]==t[j]:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
else:
dp[i][j]=dp[i-1][j]
1 class Solution: 2 def numDistinct(self, s: str, t: str) -> int: 3 ls,lt=len(s),len(t) 4 if not lt or not ls: 5 return 0 6 dp=[[0 for i in range(lt)] for j in range(ls)] 7 #dp[i][j]:s的前i+1个元素(序列a)中出现t的前j+1个元素(序列b)的个数 8 dp[0][0]=int(s[0]==t[0]) 9 for row in range(1,ls): 10 if s[row]==t[0]: 11 dp[row][0]=dp[row-1][0]+1 12 else: 13 dp[row][0]=dp[row-1][0] 14 for j in range(1,lt): 15 for i in range(1,ls): 16 #对于每一列从上到下进行 17 if s[i]==t[j]: 18 dp[i][j]=dp[i-1][j-1]+dp[i-1][j] 19 else: 20 dp[i][j]=dp[i-1][j] 21 # print(dp) 22 return dp[-1][-1] 23 # S = "aabdbaabeeadcbbdedacbbeecbabebaeeecaeabaedadcbdbcdaabebdadbbaeabdadeaabbabbecebbebcaddaacccebeaeedababedeacdeaaaeeaecbe" 24 # T = "bddabdcae" 25 # print(Solution().numDistinct(S,T))
进击的小🐴农