1. Array - Sliding Window

Sliding Window 首先一定是处理(连续) subarray或substring的问题(不连续的subsequence);

其次,只能用于处理 "window是否满足条件" 与 "window长度“ 直接相关的问题,也就是说锁死某个index作为window的末尾,那么要么window的长度是确定的(implement-strstr ) ,要么就是window越长越满足条件 (Minimum Window Substring ) 或者window越长越不满足条件 ( longest-substring-with-at-most-k-distinct-characters/) (前者求 shortest window,后者求 longest window)。

第二条原则主要是为了和用dynamic programming求subarray的问题区别开,比如:

# 正整数数组, 求sum为target的subarray
# => sliding window

def subarray_sum_positive(arr, target):
    window_sum = 0
    start_idx = 0
    for end_idx in range(len(arr)):
        window_sum += arr[end_idx]
        while window_sum > target:
            window_sum -= arr[start_idx]
            start_idx += 1
        if window_sum == target:
            return arr[start_idx:(end_idx+1)]
            
    return None
    
# 有负数的整数数组, 求sum为target的subarray
# => prefix sum (dynamic programming)

def subarray_sum(arr, target):
    sum_idx_map = {0: -1}
    sum = 0
    for idx, ele in enumerate(arr):
        sum += ele
        if sum - target in sum_idx_map:
            start_idx = sum_idx_map[sum - target] + 1
            return arr[start_idx:(idx+1)]
        
        sum_idx_map[sum] = idx
    return None

e.g.1 Given input -> "I have 36 books, 40 pens2."; output -> "I evah 36 skoob, 40 2snep." e.g.2 Compress the string "aabcccccaaa" to "a2b1c5a3"

e.g.3 https://leetcode.com/problems/find-all-anagrams-in-a-string/.

e.g.4 https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/

e.g.5 https://leetcode.com/problems/minimum-window-substring/

e.g.6 https://leetcode.com/problems/substring-with-concatenation-of-all-words/

Last updated

Was this helpful?