知道是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]
class Solution:
def numDistinct(self, s: str, t: str) -> int:
ls,lt=len(s),len(t)
if not lt or not ls:
return 0
dp=[[0 for i in range(lt)] for j in range(ls)]
#dp[i][j]:s的前i+1个元素(序列a)中出现t的前j+1个元素(序列b)的个数
dp[0][0]=int(s[0]==t[0])
for row in range(1,ls):
if s[row]==t[0]:
dp[row][0]=dp[row-1][0]+1
else:
dp[row][0]=dp[row-1][0]
for j in range(1,lt):
for i in range(1,ls):
#对于每一列从上到下进行
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]
# print(dp)
return dp[-1][-1]
# S = "aabdbaabeeadcbbdedacbbeecbabebaeeecaeabaedadcbdbcdaabebdadbbaeabdadeaabbabbecebbebcaddaacccebeaeedababedeacdeaaaeeaecbe"
# T = "bddabdcae"
# print(Solution().numDistinct(S,T))