Study Plan For Algorithms - Part38

WindMay發表於2024-09-23

1. 顏色分類
給定一個包含紅色、白色和藍色、共 n 個元素的陣列 nums ,原地 對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

  • 使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
  • 不使用庫內建的 sort 函式的情況下解決這個問題。
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        left = 0
        right = len(nums) - 1
        i = 0

        while i <= right:
            if nums[i] == 0:
                nums[i], nums[left] = nums[left], nums[i]
                left += 1
                i += 1
            elif nums[i] == 2:
                nums[i], nums[right] = nums[right], nums[i]
                right -= 1
            else:
                i += 1

2. 最小覆蓋子串
給定一個字串 s 、一個字串 t 。返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 "" 。

from collections import Counter
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if not s or not t:
            return ""

        target_count = Counter(t)
        window_count = Counter()
        left, right = 0, 0
        min_window = ""
        min_length = float('inf')
        match_count = 0

        while right < len(s):
            window_count[s[right]] += 1
            if s[right] in target_count and window_count[s[right]] == target_count[s[right]]:
                match_count += 1

            while match_count == len(target_count):
                if right - left + 1 < min_length:
                    min_length = right - left + 1
                    min_window = s[left:right + 1]

                window_count[s[left]] -= 1
                if s[left] in target_count and window_count[s[left]] < target_count[s[left]]:
                    match_count -= 1
                left += 1

            right += 1

        return min_window

相關文章