Given a string S and a string T, count the number of distinct subsequences of T in S.code
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).orm
Here is an example:
S = "rabbbit"
, T = "rabbit"
rem
Return 3
.字符串
終於見到一個使用動態規劃的題目了,彷佛這種字符串比對的差很少都是DP的思路。
這個問題其實是問一個長字符串中有幾個給定的子串,所以從開始比較,以最後一個字符爲例,若是T的最後一個字符和S的最後一個字符不相同相同,那麼問題就成爲求字符串S[:-2]
中字符T的個數;若是相同,問題就變爲求字符串S[:-2]
中字符T的個數和S[:-2]
中子串T[:-2]
的個數之和。從後向前遞推,咱們能夠獲得下面的矩陣string
r a b b b i t 1 1 1 1 1 1 1 1 r 0 1 1 1 1 1 1 1 a 0 0 1 1 1 1 1 1 b 0 0 0 1 2 3 3 3 b 0 0 0 0 1 3 3 3 i 0 0 0 0 0 0 3 3 t 0 0 0 0 0 0 0 3
能夠看出,矩陣中每一個entry的數值爲match[i][j] = match[i][j-1] + (match[i-1][j-1] if S[j-1] == T[i-1] else 0)
,這樣右下角的值即爲所求。it
AC代碼以下:io
class Solution: # @return an integer def numDistinct(self, S, T): length_s = len(S) length_t = len(T) if length_s == 0: return 0 if length_t != 0 else 1 if length_t == 0: return 1 match = [[0 for dummy_i in range(length_s + 1)] for dummy_j in range(length_t + 1)] for col in range(length_s + 1): match[0][col] = 1 for s_idx in range(1, length_s + 1): for t_idx in range(1, length_t + 1): match[t_idx][s_idx] = match[t_idx][s_idx - 1] if S[s_idx - 1] == T[t_idx - 1]: match[t_idx][s_idx] += match[t_idx - 1][s_idx - 1] return match[length_t][length_s]