LeetCode 115 - Distinct Subsequence
題目
題目連結:https://leetcode.com/problems/distinct-subsequences/
給定兩字串 s
, t
,求出 s
字串中有多少的子序列(subsequence)等於 t
。
範例說明
Example 1:
1 | Input: s = "rabbbit", t = "rabbit" |
Example 2:
1 | Input: s = "babgbag", t = "bag" |
想法
假設字串 s
, t
從索引 1 開始編號。
定義 dp(i, j)
代表 s[1 ~ j]
可以產生幾個子序列等於 t[1 ~ i]
。
接著考慮 dp(i, j)
的數量要怎麼求得,分為以下兩種情形:
-
s[j] ≠ t[i]
:因為
s[j]
不能匹配到t[i]
,所以s[1 ~ j - 1]
可以匹配到t[1 ~ j]
之數量等於s[1 ~ j]
可以匹配到t[1 ~ j]
的數量。Example:
s = ababc
中有 4 個子序列等於t = ab
,因為s
的最後一個字元c
不匹配到t
的最後一個字元b
,因此移除c
對能匹配的數量是沒有影響的,也就是s = abab
也有 4 個子序列等於t = ab
。總結來說:
-
s[j] = t[i]
:s[1 ~ j]
中的子序列,可以分為有用到s[j]
的子序列與沒有用到s[j]
的子序列。- 沒有用到
s[j]
的子序列:
沒有用到s[j]
的子序列其實就是s[1 ~ j - 1]
的子序列,其中等於t[1 ~ i]
的數量也就是dp(i, j - 1)
。 - 有用到
s[j]
的子序列:
若有用到s[j]
且子序列等於t[1 ~ i]
,代表s[j]
恰好匹配到t[i]
,因此s[1 ~ j]
中等於t[1 ~ i]
的數量等於s[1 ~ j - 1]
中的子序列等於t[1 ~ i - 1]
的數量,也就是dp(i - 1, j - 1)
。
總結來說:
- 沒有用到
實作細節
注意實際情況中,s
, t
兩字串都是從索引值 0 開始編號,因此在使用 s[j]
, t[i]
的時候要分別改為 s[j - 1]
與 t[i - 1]
。
另外,邊界值的部分,所有 dp(0, j) = 1
,因為任何長度的 s
字串都有一種子序列(空集合)可以等於空字串。
另外,可以發現當 i > j
時,dp(i, j)
一定等於 0,因為 s
長度比 t
短的話是不可能有子序列等於 t
的。
最後,雖然答案在 int
範圍內,但是運算過程是有可能超出的,所以要使用 long long
的 dp 陣列,最後回傳再換回 int
即可。
程式碼
1 | /** |