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))  

 

posted @ 2019-08-07 00:47  NeoZy  阅读(123)  评论(0编辑  收藏  举报