Leetcode 76 Minimum Window Substring

Soru

Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there is no such substring, return the empty string “”.

The testcases will be generated such that the answer is unique.

Örnek 1

Input: s = "ADOBECODEBANC", t = "ABC"
Output: "BANC"
Explanation: The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.

Örnek 2

Input: s = "a", t = "a"
Output: "a"
Explanation: The entire string s is the minimum window.

Örnek 3

Input: s = "a", t = "aa"
Output: ""
Explanation: Both 'a's from t must be included in the window.
Since the largest window of s only has one 'a', return empty string.

Çözüm

  • Verilen iki string s ve t arasında, t içindeki tüm karakterleri kapsayan s stringinin en küçük alt dizisini bulmanızı ister. Bu alt dizi, t stringindeki tüm karakterleri içeren s stringinden alınmış en kısa ardışık dizi olmalıdır.
  • Girdi: İki string, s ve t.
  • Çıktı: s içinde, t içindeki tüm karakterleri içeren en küçük alt dizi. Eğer böyle bir alt dizi yoksa boş string döndürülür.
  • Bu problem genellikle kaydırmalı pencere (sliding window) ve hash map kullanılarak çözülür. t stringindeki karakterlerin frekanslarını bir hash map’te saklayarak başlanır. Ardından, s üzerinde bir pencere kaydırarak bu pencerenin t stringindeki tüm karakterleri içerip içermediğini kontrol edersiniz. Pencere, t’deki tüm karakterleri kapsadığında, bu pencereyi olabildiğince daraltarak en küçük alt diziyi bulmaya çalışırsınız.
  • Çalışma Mekanizması:
  • İnitialize: dict_t t’deki karakterlerin frekansını saklar. required t’deki benzersiz karakter sayısını, formed ise şu an pencerede bulunan ve t’deki karakterleri karşılayan karakter sayısını tutar.
  • Kaydırmalı Pencere: s üzerinde r (sağ) işaretçisiyle ilerlerken, pencereye karakterler eklenir. Her karakter için, window_counts güncellenir.
  • Pencereyi Daraltma: Pencere t’deki tüm karakterleri içerdiğinde, l (sol) işaretçisiyle pencere daraltılarak mümkün olan en küçük boyut aranır.
  • Sonuç Dönüşü: Eğer bir sonuç bulunmuşsa, bu sonuç döndürülür. Bulunamamışsa boş string döndürülür.

Code

from collections import Counter

class Solution:
    def minWindow(self, s, t):
        if not t or not s:
            return ""

        dict_t = Counter(t)
        required = len(dict_t)
        l, r = 0, 0
        formed = 0
        window_counts = {}

        ans = float("inf"), None, None  # Pencerenin boyutu, başlangıç ve bitiş indeksleri

        while r < len(s):
            character = s[r]
            window_counts[character] = window_counts.get(character, 0) + 1

            if character in dict_t and window_counts[character] == dict_t[character]:
                formed += 1

            while l <= r and formed == required:
                character = s[l]

                if r - l + 1 < ans[0]:
                    ans = (r - l + 1, l, r)

                window_counts[character] -= 1
                if character in dict_t and window_counts[character] < dict_t[character]:
                    formed -= 1

                l += 1    

            r += 1

        return "" if ans[0] == float("inf") else s[ans[1]:ans[2] + 1]
     
        

Complexity

  • Time complexity (Zaman Karmaşıklığı) : O(S + T), burada S ve T sırasıyla s ve t stringlerinin uzunluklarıdır.
  • Space complexity (Alan Karmaşıklığı) : O(S + T), hash map için kullanılan alan nedeniyle.