【LeetCode】115. Distinct Subsequences 解題報告(Python)
阿新 • • 發佈:2019-02-02
目錄
題目描述
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"
"ABCDE"
while "AEC"
is not).
Example 1:
Input: S = "rabbbit", T = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)
rabbbit
^^^^ ^^
rabbbit
^^ ^^^^
rabbbit
^^^ ^^^
Example 2:
Input: S = "babgbag", T = "bag" Output: 5 Explanation: As shown below, there are 5 ways you can generate "bag" from S. (The caret symbol ^ means the chosen letters) babgbag ^^ ^ babgbag ^^ ^ babgbag ^ ^^ babgbag ^ ^^ babgbag ^^^
題目大意
求S中有多少個子序列等於T。
解題方法
動態規劃
這個題一看就是DP。向字串序列問題確實有很多都是用DP求解的。
設dp陣列dp[i][j]表示S的前j個字元是T的前i個字元的子序列的個數為dp[i][j]。
那麼有dp[0][*] == 1,因為這個情況下,只能使用s的空字串進行匹配t。
如果s[j - 1] == t[i - 1],那麼,dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1],原因是t的前j個字元可以由s的前[i - 1]個字元和t的前[j - 1]個匹配的同時最後一個字元匹配,加上s的前[j - 1]個字元和t的前[i]個字元匹配同時丟棄s的第[j]個字元。
如果s[j - 1] != t[i - 1],那麼dp[i][j] = dp[i][j - 1],因為只能是前面的匹配,最後一個字元不能匹配,所以丟棄了。
class Solution:
def numDistinct(self, s, t):
"""
:type s: str
:type t: str
:rtype: int
"""
M, N = len(s), len(t)
dp = [[0] * (M + 1) for _ in range(N + 1)]
for j in range(M + 1):
dp[0][j] = 1
for i in range(1, N + 1):
for j in range(1, M + 1):
if s[j - 1] == t[i - 1]:
dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]
else:
dp[i][j] = dp[i][j - 1]
return dp[-1][-1]
日期
2018 年 11 月 19 日 —— 週一又開始了