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]
本文介绍了一种使用动态规划解决字符串子序列计数问题的方法,通过对比递归回溯法,展示了动态规划在解决此类问题时的优势。
775

被折叠的 条评论
为什么被折叠?



