力扣-Hot100-滑动窗口篇

94 阅读1分钟

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

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。

示例 1:

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

思路:无定长的滑动窗口,统计子串的最大长度,当出现重复字符时,向右推动滑动窗口。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ss = []
        n = len(s)
        j = res = 0
        for i in range(n):
            while s[i] in ss:
                ss.pop(0)
                j += 1
            ss.append(s[i])
            res = max(res, i - j + 1)
        return res

438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

思路:定长滑动窗口,当窗口大小达到字符串p的长度后,将窗口中的子串与p进行比对。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        k = len(p)
        n = len(s)
        pp = Counter(p)
        ss = defaultdict(int)
        ans = []
        for i, x in enumerate(s):
            ss[x] += 1
            if i < k - 1:
                continue
            ok = True
            for kk in pp.keys():
                if pp[kk] != ss[kk]:
                    ok = False
            if ok:
                ans.append(i - k + 1)
            ss[s[i - k + 1]] -= 1
        return ans