727. Minimum Window Subsequence
題目網址:https://leetcode.cn/problems/minimum-window-subsequence/
題意:給兩 string
s1、s2, 找出s1中最短的連續 substringw, 使得s2是w的 subsequence。如果
s1中沒有 window 可以包含s2中的所有 char, 則返回""。如果有不只一個最短長度的窗口, 則返回開始位置最靠左的那個。注意:
s1、s2皆只由小寫英文所組成。

Solution:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
s1、s2前先加上一個#, 代表什麼元素都沒有的狀態dp[i][j]:以s[i]為結尾, 用s1[1:i]、s2[1:j]的 Minimum Window Subsequence 之長度2. 得到轉移方程:
令
s1[1:i] = XXXXi,s2[1:j] = YYYj
- 若
s1[i] == s2[j], 則[XXXX]、[YYY]建構的 substring 加上s1[i]即可
➔dp[i][j] = dp[i - 1][j - 1] + 1- 否則,
[XXXX]、[YYYj]建構的 substring 加上s1[i]即可
➔dp[i][j] = dp[i - 1][j] + 13. 初始化:
dp[0][0]:兩個 empty string""之 Minimum Window Subsequence 是""
➔dp[0][0] = 0dp[i][0]:s1[1:i]、""的 Minimum Window Subsequence 永遠是""
➔dp[i][0] = 0, 其中1 ≤ i ≤ mdp[0][j]:s1[1:i] = ""、s2[1:j]之 Minimum Window Subsequence 設為INT_MAX / 2, 代表s1[1:j]不存在包含s2[1:j]之 substring。之所以不設成INT_MAX是因為這樣後續計算dp[i][j]時會 overflow
➔dp[0][j] = INT_MAX / 2, 其中1 ≤ j ≤ n4. 注意事項:
- 做完後, 找出所有
dp[i][n]中最小的i。如此一來, 就取得了 substring 結尾的 idxi和長度dp[i][n]
➔ 從而倒推出 substring 的起始 idxi - dp[i][n] + 1- 由於可能
s1沒有 window 可以包含s2中的所有 char。但在狀態轉移方程中, 我們在s1[i] != s2[j]時, 仍直接把s1[i]加入到 window 中, 且dp[0][j]之初始值為INT_MAX
➔ 因此我們最後要檢查最短窗口的長度是否≥ INT_MAX。若是的話, 代表s1中不存在包含s2的 window
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論