当前位置: 首页 > 后端技术 > Python

滑动窗口算法

时间:2023-03-25 23:41:48 Python

参考文章:leetcode438题答案0x00:前言leetcode上有几道子串相关的题。前两天看到一道题,要求找出字符串中所有的字谜。两个字符串s和p,找出s中与p字母相同但顺序可以不同的子串,返回这些子串的起始索引。示例:输入:s:"cbaebabacd"p:"abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"的变位词。起始索引等于6的子串是“bac”,它是“abc”的变位词。题目链接:https://leetcode-cn.com/probl...0x01:算法思路想象一个玻璃窗在窗上滑动,它的“左”和“右”边可以移动,也就是这个玻璃的位置窗口可以移动,宽度也可以改变。好像更像窗帘。。。思路如下:创建双指针,初始化左右指针,以闭区间[left,right]为窗口,先拉窗口右侧,并且窗口将继续扩展,直到它到达窗口的中间。内容符合要求。现在移动窗口的左侧,直到窗口中的内容不符合要求。重复步骤2和3,直到窗口右侧到达边界。使用这种方法可以轻松解决子串相关的问题。0x02:具体解决方案首先,代码中,双指针right和left不能少,需要一个值来记录匹配情况。返回值需要一个列表来记录匹配子串的第一个索引。使用哈希表记录字符串p中每个字符的个数,使用Python中的Count类,它是字典dict的子类,可以使用字典常用的方法右移遍历字符串s,如果right所在的字符在t中存在,存入字典window中,记录其个数的值加1。window[key]=window.get(key,0)+1#字典的get方法:dict.get(key,default=None),返回字典中key的值,如果key不存在,返回默认的默认值。#这样写,保证window[key]的值加1,如果这个key不存在,就会创建。当window中记录的字符数与需要的字符数相等时,说明我们匹配到了一个字符,将匹配值加1,直到匹配到的字符长度合适,可以追加left的值到需要返回的列表whilematch==len(needs):ifright-left==len(p):res.append(left)向左移动,直到窗口的内容乱序的字符串no不再满足我们的需求,匹配值也减一。完整代码如下:fromcollectionsimportCounterclassSolution:deffindAnagrams(self,s:str,p:str)->List[int]:res=[]right,left,match=0,0,0needs=Counter(p)window={}whileright