def solve(s,t,i,j,dp):
if (i,j) in dp:
return dp[(i,j)]
if i>=len(s) and j>=len(t):
return 1
if j>=len(t):
return 1
if i>=len(s):
return 0
ans=solve(s,t,i+1,j,dp)
if s[i]==t[j]:
ans+=solve(s,t,i+1,j+1,dp)
dp[(i,j)]=ans
return ans
class Solution:
def numDistinct(self, s: str, t: str) -> int:
dp={}
n=len(s)
m=len(t)
dp=[[0]*(m+1) for x in range(2)]
dp[0][0]=1
for x in range(2):
dp[x][0]=1
flag=0
for i in range(1,len(s)+1):
for j in range(1,len(t)+1):
if s[i-1]==t[j-1]:
dp[flag][j]=dp[flag^1][j-1]+dp[flag^1][j]
else:
dp[flag][j]=dp[flag^1][j]
flag=flag^1
return dp[flag^1][m]
ZGVmIHNvbHZlKHMsdCxpLGosZHApOgogICAgaWYgKGksaikgaW4gZHA6CiAgICAgICAgcmV0dXJuIGRwWyhpLGopXQogICAgaWYgaT49bGVuKHMpIGFuZCBqPj1sZW4odCk6CiAgICAgICAgcmV0dXJuIDEKICAgIGlmIGo+PWxlbih0KToKICAgICAgICByZXR1cm4gMQogICAgaWYgaT49bGVuKHMpOgogICAgICAgIHJldHVybiAwCiAgICBhbnM9c29sdmUocyx0LGkrMSxqLGRwKQogICAgaWYgc1tpXT09dFtqXToKICAgICAgICBhbnMrPXNvbHZlKHMsdCxpKzEsaisxLGRwKQogICAgZHBbKGksaildPWFucwogICAgcmV0dXJuIGFucwoKY2xhc3MgU29sdXRpb246CiAgICBkZWYgbnVtRGlzdGluY3Qoc2VsZiwgczogc3RyLCB0OiBzdHIpIC0+IGludDoKICAgICAgICBkcD17fQogICAgICAgIG49bGVuKHMpCiAgICAgICAgbT1sZW4odCkKICAgICAgICBkcD1bWzBdKihtKzEpIGZvciB4IGluIHJhbmdlKDIpXQogICAgICAgIGRwWzBdWzBdPTEKICAgICAgICBmb3IgeCBpbiByYW5nZSgyKToKICAgICAgICAgICAgZHBbeF1bMF09MQogICAgICAgIGZsYWc9MAogICAgICAgIGZvciBpIGluIHJhbmdlKDEsbGVuKHMpKzEpOgogICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgxLGxlbih0KSsxKToKICAgICAgICAgICAgICAgIGlmIHNbaS0xXT09dFtqLTFdOgogICAgICAgICAgICAgICAgICAgIGRwW2ZsYWddW2pdPWRwW2ZsYWdeMV1bai0xXStkcFtmbGFnXjFdW2pdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRwW2ZsYWddW2pdPWRwW2ZsYWdeMV1bal0KICAgICAgICAgICAgZmxhZz1mbGFnXjEKICAgICAgICByZXR1cm4gZHBbZmxhZ14xXVttXQ==