力扣:滑动窗口题合集

目录

3. 无重复字符的最长子串(滑动窗口)

解法一:

解法二:

76. 最小覆盖子串

 567. 字符串的排列 


3. 无重复字符的最长子串(滑动窗口)

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

解法一:

左指针及右指针

右指针一步步向右滑动直至字符串结尾(for 循环),过程中更新左指针使范围内的字符串符合条件(即从原始左指针开始遍历直到找到重复字符的位置,更新左指针指向重复字符的下一个字符)

全局变量:左指针、最大长度、当前长度、当前左右指针范围内的字符串

临时变量:右指针

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        res = set()
        maxlen = 0
        curlen = 0
        left = 0
        for i in range(len(s)):
            while s[i] in res:
                res.remove(s[left])
                left += 1
                curlen -= 1 
            res.add(s[i])
            curlen += 1
            if curlen > maxlen:
                maxlen = curlen
        return maxlen

解法二:

使用哈希表,即用字典记录左右指针位置

右指针一步步向右滑动直至字符串结尾(for 循环),过程中若右指针字符在哈希表中对应的index大于左指针,则更新左指针指向右指针字符 原index+1及右指针字符index为右指针

全局变量:左指针、最大长度、字典

临时变量:右指针

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        res = {}
        start = 0
        maxlen = 0
        for i in range(len(s)):
            if s[i] in res.keys() and res[s[i]] >= start:
                start = res[s[i]] + 1
            res[s[i]] = i 
            curlen = i-start + 1
            maxlen = max(curlen, maxlen)
        return maxlen

76. 最小覆盖子串

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"

哈希表记录目标字符串中字符及出现个数,这里使用Counter()函数

右指针一步步向右滑动,抵消目标字符串中的所有字符,同时向右移动左指针,使字符串最短,更新目前的最短长度及最短字符串

全局变量:目标字符串哈希表,左指针,最短长度,最短字符串

临时变量:右指针

from collections import Counter
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        if len(s) < len(t):
            return ""
        left = 0
        minlen = len(s)
        res = ""
        ht = Counter(t)
        for i in range(len(s)):
            if s[i] in ht.keys():
                ht[s[i]] -= 1
            while max(ht.values()) == 0 and left <= i:
                if minlen >= i - left + 1:
                    res = s[left:i+1]
                    minlen = i - left + 1
                if s[left] in ht.keys():
                    ht[s[left]] += 1
                left += 1
        return res

 567. 字符串的排列 

输入:s1= "ab" s2 = "eidboaoo"
输出:false

 判断覆盖目标字符串的最小长度是否等于目标字符串的长度

from collections import Counter
class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        if len(s1) > len(s2):
            return False
        minlen = float("inf")
        left = 0
        h1 = Counter(s1)
        for i in range(len(s2)):
            if s2[i] in h1.keys():
                h1[s2[i]] -= 1
            while max(h1.values()) == 0 and left <= i:
                if minlen >= i-left+1:
                    minlen = i-left+1
                if s2[left] in h1.keys():
                    h1[s2[left]] += 1
                left +=1 
        
        return minlen == len(s1)

你可能感兴趣的:(刷题,leetcode,算法,python)