题目地址:https://oj.leetcode.com/problems/distinct-subsequences/
利用动态规划处理,当利用动态规划时,需要用一个数据结构保存处理过的数据,设计一个合理的结构来表示处理过程是解决动态规划问题的关键
利用二维数组来表示arr[j][i]表示S中0-i之间的字符串能够满足包含T中前j个字符串的方法数。以aaabbb为例,最终得到的数组如下
1 1 0
1 2 0
1 3 0
1 3 3
1 3 6
1 3 9
可以发现规律如下当T[i-1]与S[j]相等时,arr[j][i] = arr[j-1][i]+arr[j-1][i-1]
如果T[i-1]与S[j]不相等时,arr[j][i] = arr[j-1][i]
在解题的过程中,我错误地初始化了数组,将数组初始化为0,实际上arr[j][0]应该为1。所以正确初始化也是动态规划的关键之一。
最终代码如下
class Solution:
# @return an integer
def numDistinct(self, S, T):
height = len(S)
width = len(T)
if width==0:
return 1
if width > height:
return 0
arr = [[1 if j==0 else 0 for j in range(0,width+1)] for i in range(0,height)]
for i in range(1,width+1):
for j in range(i-1,height):
if T[i-1] == S[j]:
if j==0 :
arr[j][i] = 1
else:
arr[j][i] = arr[j-1][i] + arr[j-1][i-1]
else:
if j==0:
arr[j][i] = 0
else:
arr[j][i] = arr[j-1][i]
return arr[height-1][width]