力扣 3. 无重复字符的最长子串

100 阅读1分钟

1. 题目

leetcode.cn/problems/lo…

image.png

2. 解析

使用滑动窗口进行解法 模板:

def slidingWindow(s:str,t:str):
    '''初始化 window 和 need 两个哈希表,记录窗口中的字符和需要凑齐的字符:'''
    need, window = collections.defaultdict(int), collections.defaultdict(int) # {char:int}
    for c in t:
        need[c] += 1
    left, right = 0, 0
    valid = 0 # 表示窗口中满足need条件的字符个数,如果valid和len(need)的大小相同,则说明窗口已满足条件
    '''使用 left 和 right 变量初始化窗口的两端,不要忘了,区间 [left, right) 是左闭右开的,所以初始情况下窗口没有包含任何元素:'''
    while right < len(s):
        # c是将要移入窗口的字符
        c = s[right]
        # 增大窗口
        right += 1
        # 进行窗口内数据的一系列更新
        ..."""更新窗口数据的地方"""

        # 判断左侧窗口是否要收缩
        while '''window needs shrink''':
            # d是将要移出窗口的字符
            d = s[left]
            # 缩小窗口
            left += 1
            # 进行窗口内数据的一系列更新
        	..."""更新窗口数据的地方"""

3. 核心代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        right = 0
        windows = {}
        res = 0
        while right < len(s):
            # 增大窗口
            cur = s[right]
            right += 1
            # 根据cur往window-窗口里记录当前的元素
            windows[cur] = windows.get(cur, 0) + 1
            # 判断是否需要缩小窗口,这里的条件是,判断windows[cur]是否大于1
            while windows[cur] > 1:
                delete = s[left]
                left += 1
                windows[delete] -= 1
            # 到这里,s[left: right]的结果里是不含有重复字符的
            # 注意,这里的索引是左闭右开区间,[left, right)
            res = max(res, right - left)
        return res


if __name__ == '__main__':
    s = Solution()
    print(s.lengthOfLongestSubstring("pwwkew"))