Minimum Window Subsequence

hard dp two pointers string

Problem

Given strings s1 and s2, return the minimum-length contiguous substring W of s1 such that s2 is a subsequence of W. If no such window exists, return the empty string; on ties return the leftmost answer.

Inputs1="abcdebdde", s2="bde"
Output"bcde"
"bcde" contains "bde" as a subsequence and is the shortest such window.

def minWindow(s1, s2):
    n, m = len(s1), len(s2)
    best, blen = -1, n + 1
    i = 0
    while i < n:
        j = 0
        k = i
        while k < n:
            if s1[k] == s2[j]:
                j += 1
                if j == m: break
            k += 1
        if j < m: break
        end = k
        j = m - 1
        while j >= 0:
            if s1[k] == s2[j]: j -= 1
            k -= 1
        k += 1
        if end - k + 1 < blen:
            blen = end - k + 1; best = k
        i = k + 1
    return "" if best < 0 else s1[best:best + blen]
function minWindow(s1, s2) {
  const n = s1.length, m = s2.length;
  let best = -1, blen = n + 1, i = 0;
  while (i < n) {
    let j = 0, k = i;
    while (k < n) {
      if (s1[k] === s2[j]) { j++; if (j === m) break; }
      k++;
    }
    if (j < m) break;
    const end = k;
    j = m - 1;
    while (j >= 0) { if (s1[k] === s2[j]) j--; k--; }
    k++;
    if (end - k + 1 < blen) { blen = end - k + 1; best = k; }
    i = k + 1;
  }
  return best < 0 ? "" : s1.substring(best, best + blen);
}
class Solution {
  public String minWindow(String s1, String s2) {
    int n = s1.length(), m = s2.length(), best = -1, blen = n + 1, i = 0;
    while (i < n) {
      int j = 0, k = i;
      while (k < n) {
        if (s1.charAt(k) == s2.charAt(j)) { j++; if (j == m) break; }
        k++;
      }
      if (j < m) break;
      int end = k;
      j = m - 1;
      while (j >= 0) { if (s1.charAt(k) == s2.charAt(j)) j--; k--; }
      k++;
      if (end - k + 1 < blen) { blen = end - k + 1; best = k; }
      i = k + 1;
    }
    return best < 0 ? "" : s1.substring(best, best + blen);
  }
}
class Solution {
public:
  string minWindow(string s1, string s2) {
    int n = s1.size(), m = s2.size(), best = -1, blen = n + 1, i = 0;
    while (i < n) {
      int j = 0, k = i;
      while (k < n) {
        if (s1[k] == s2[j]) { j++; if (j == m) break; }
        k++;
      }
      if (j < m) break;
      int end = k;
      j = m - 1;
      while (j >= 0) { if (s1[k] == s2[j]) j--; k--; }
      k++;
      if (end - k + 1 < blen) { blen = end - k + 1; best = k; }
      i = k + 1;
    }
    return best < 0 ? "" : s1.substr(best, blen);
  }
};
Time: O(n * m) Space: O(1)