Distinct Subsequences

Problem

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.字符串

Solution

終於見到一個使用動態規劃的題目了,彷佛這種字符串比對的差很少都是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]
相關文章
相關標籤/搜索