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 | /** |