至多包含k個不同字符的最長子串

"至多包含k個不同字元的最長子串"是一個經典的計算機科學問題,通常使用滑動視窗算法來解決。下面是一個使用Python實現的簡單解決方案:

def length_of_longest_substring(s: str, k: int) -> int:
    """
    返回字元串s中至多包含k個不同字元的最長子串的長度。
    """
    # 初始化視窗大小為1
    start = 1
    # 用於存儲當前視窗中不同字元的數量
    window_counts = {s[start]: 1}
    max_length = 1  # 最長子串的初始長度為1

    # 當視窗未到達字元串末尾時繼續疊代
    while start < len(s):
        # 更新視窗中不同字元的數量
        new_counts = window_counts.copy()
        for char in window_counts:
            if s[start] == char:
                window_counts[char] += 1
            else:
                window_counts[char] = 1
        # 如果視窗中的不同字元數量不超過k,則增加視窗大小並更新最長子串長度
        if len(window_counts) <= k:
            max_length += 1
            start += 1
        else:  # 如果視窗中的不同字元數量超過k,則收縮視窗大小並重新計算最長子串長度
            window_counts[s[start - k + 1]] -= 1
            if window_counts[s[start - k]] == 0:  # 如果視窗中的某個字元不再出現,則收縮視窗大小並更新視窗計數
                del window_counts[s[start - k]]
            start -= 1
    return max_length

這個算法的時間複雜度是O(n),其中n是字元串的長度。它通過疊代地移動視窗並維護一個視窗計數字典來解決問題。如果視窗中的不同字元數量超過k,它會收縮視窗並重新計算最長子串長度。最後,返回的結果是最長子串的長度。