Given a string S and a string T, count the number of distinct subsequences of S which equals T.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE"
is a subsequence of "ABCDE"
while "AEC"
is not).
Here is an example:
S = "rabbbit"
, T = "rabbit"
Return 3
.
第一反应用递归回溯,结果超时。复杂度是O(2^n)
def numDistinct(self, s, t):
def fd(s_n,t_n):
if t_n==self.t_l:
self.num+=1
else:
if self.s_l-s_n<self.t_l-t_n:
return
else:
if s[s_n]==t[t_n]:
fd(s_n+1,t_n+1)
fd(s_n+1,t_n)
self.num,self.s_l,self.t_l=0,len(s),len(t)
if self.s_l==0 or self.t_l==0 or self.s_l<self.t_l:
return 0
fd(0,0)
return self.num
翻了下discuss,用DP,恍然大悟。记得刚开始学算法时,王老师说DP的难度就在于要有人告诉你要用DP。果然如此
class Solution(object):
def numDistinct(self, s, t):
self.num,self.s_l,self.t_l,result=0,len(s),len(t),[]
if self.s_l==0 or self.t_l==0 or self.s_l<self.t_l:
return 0
for i in range(self.s_l+1):
result.append([0]*(self.t_l+1))
result[i][0]=1
for i in range(self.s_l):
for j in range(self.t_l):
if s[i]==t[j]:
result[i+1][j+1]=result[i][j]+result[i][j+1]
else:
result[i+1][j+1]=result[i][j+1]
return result[self.s_l][self.t_l]