LeetCode算法刷题——滑动窗口

LeetCode算法刷题by Python——滑动窗口

  • 1. 无重复字符的最长子串
  • 2. 字符串的排列

今天我们来学习滑动窗口题型的解法。

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

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
示例 4:
输入: s = “”
输出: 0

这种统计最长子串长度的题目,一定是需要将后统计出来的数跟之前存下来的最大数作比较。
做题思路:首先将右指针放在字符串头部,然后将不重复字符存入哈希集合中,有重复的话就不再移动指针,并统计集合中的字符数,接下来左指针移动一个单位,再移动右指针直到没有重复为止;遍历整个字符串即可。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        occ = set()
        rp, ans = 0, 0
        for i in range(n):
            if i != 0:
                occ.remove(s[i - 1])
            
            while rp < n and s[rp] not in occ:
                occ.add(s[rp])
                rp += 1
            ans = max(ans, rp - i)
        return ans

2. 字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入:s1= “ab” s2 = “eidboaoo”
输出:false

这道题可以用数组代替字典,来统计对应字母顺序的字符个数,然后滑动窗口进行重复判定。

class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        n1, n2 = len(s1), len(s2)
        dic1 = [0] * 26
        dic2 = [0] * 26
        if n1 > n2:
            return False
        
        for i in range(n1):
            dic1[ord(s1[i]) - ord('a')] += 1
            dic2[ord(s2[i]) - ord('a')] += 1
        if dic1 == dic2:
            return True
        
        for i in range(n1, n2):
            dic2[ord(s2[i - n1]) - ord('a')] -= 1   # 滑动操作,去掉第一个字符,加入新字符
            dic2[ord(s2[i]) - ord('a')] += 1
            if dic1 == dic2:
                return True
        return False

(未来更新更多题目,敬请关注。新手们看到这里就可以啦~)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com

你可能感兴趣的:(LeetCode算法刷题,leetcode,算法,职场和发展)