Welcome to Subscribe On Youtube
727. Minimum Window Subsequence
Description
Given strings s1
and s2
, return the minimum contiguous substring part of s1
, so that s2
is a subsequence of the part.
If there is no such window in s1
that covers all characters in s2
, return the empty string ""
. If there are multiple such minimum-length windows, return the one with the left-most starting index.
Example 1:
Input: s1 = "abcdebdde", s2 = "bde" Output: "bcde" Explanation: "bcde" is the answer because it occurs before "bdde" which has the same length. "deb" is not a smaller window because the elements of s2 in the window must occur in order.
Example 2:
Input: s1 = "jmeqksfrsdcmsiwvaovztaqenprpvnbstl", s2 = "u" Output: ""
Constraints:
1 <= s1.length <= 2 * 104
1 <= s2.length <= 100
s1
ands2
consist of lowercase English letters.
Solutions
-
class Solution { public String minWindow(String s1, String s2) { int m = s1.length(), n = s2.length(); int[][] f = new int[m + 1][n + 1]; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (s1.charAt(i - 1) == s2.charAt(j - 1)) { f[i][j] = j == 1 ? i : f[i - 1][j - 1]; } else { f[i][j] = f[i - 1][j]; } } } int p = 0, k = m + 1; for (int i = 1; i <= m; ++i) { if (s1.charAt(i - 1) == s2.charAt(n - 1) && f[i][n] > 0) { int j = f[i][n] - 1; if (i - j < k) { k = i - j; p = j; } } } return k > m ? "" : s1.substring(p, p + k); } }
-
class Solution { public: string minWindow(string s1, string s2) { int m = s1.size(), n = s2.size(); int f[m + 1][n + 1]; memset(f, 0, sizeof(f)); for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (s1[i - 1] == s2[j - 1]) { f[i][j] = j == 1 ? i : f[i - 1][j - 1]; } else { f[i][j] = f[i - 1][j]; } } } int p = 0, k = m + 1; for (int i = 1; i <= m; ++i) { if (s1[i - 1] == s2[n - 1] && f[i][n]) { int j = f[i][n] - 1; if (i - j < k) { k = i - j; p = j; } } } return k > m ? "" : s1.substr(p, k); } };
-
class Solution: def minWindow(self, s1: str, s2: str) -> str: m, n = len(s1), len(s2) f = [[0] * (n + 1) for _ in range(m + 1)] for i, a in enumerate(s1, 1): for j, b in enumerate(s2, 1): if a == b: f[i][j] = i if j == 1 else f[i - 1][j - 1] else: f[i][j] = f[i - 1][j] p, k = 0, m + 1 for i, a in enumerate(s1, 1): if a == s2[n - 1] and f[i][n]: j = f[i][n] - 1 if i - j < k: k = i - j p = j return "" if k > m else s1[p : p + k]
-
func minWindow(s1 string, s2 string) string { m, n := len(s1), len(s2) f := make([][]int, m+1) for i := range f { f[i] = make([]int, n+1) } for i := 1; i <= m; i++ { for j := 1; j <= n; j++ { if s1[i-1] == s2[j-1] { if j == 1 { f[i][j] = i } else { f[i][j] = f[i-1][j-1] } } else { f[i][j] = f[i-1][j] } } } p, k := 0, m+1 for i := 1; i <= m; i++ { if s1[i-1] == s2[n-1] && f[i][n] > 0 { j := f[i][n] - 1 if i-j < k { k = i - j p = j } } } if k > m { return "" } return s1[p : p+k] }
-
function minWindow(s1: string, s2: string): string { const m = s1.length; const n = s2.length; const f: number[][] = Array(m + 1) .fill(0) .map(() => Array(n + 1).fill(0)); for (let i = 1; i <= m; ++i) { for (let j = 1; j <= n; ++j) { if (s1[i - 1] === s2[j - 1]) { f[i][j] = j === 1 ? i : f[i - 1][j - 1]; } else { f[i][j] = f[i - 1][j]; } } } let p = 0; let k = m + 1; for (let i = 1; i <= m; ++i) { if (s1[i - 1] === s2[n - 1] && f[i][n]) { const j = f[i][n] - 1; if (i - j < k) { k = i - j; p = j; } } } return k > m ? '' : s1.slice(p, p + k); }