力扣热题100——滑动窗口
无重复字符的最长子串
3. 无重复字符的最长子串
思路
用双指针指针走出一个窗口,右指针一直向前移动。如果开一个哈希表记录窗口中出现的字符。哈希的key是这个字符,哈希的值是这个字符最近出现的下标。如果当前碰到的字符已经在窗口当中出现过,那么左指针移动到当前字符在窗口中的出现的位置的下一个。移动的过程中记录最大的窗口长度。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
mp = {}
j = 0
ans = 0
for i in range(len(s)):
if s[i] in mp and mp[s[i]]>=j:
j = mp[s[i]] + 1
mp[s[i]] = i
ans = max(ans, i-j+1)
return ans
找到字符串中所有字母异位词
438. 找到字符串中所有字母异位词
思路
如果判断两个字符串是否是异位词?
因为字符串全部由小写字母组成,小写字母只有26个,那么我们可以开两个哈希表记录字符串出现的字符,如果这两个哈希表相等,那么说明这两个字符串是异位词
先开一个哈希表mp1
记录在字符串p
在字符出现的次数。再开一个哈希表 mp2
, 双指针left, right
维护一个滑动窗口,初始时都为0
。右指针一直往前移动:
- 如果当前这个字符
ch
在p
中出现过,那么在哈希表mp2
中记录。并且检查这个字符在mp2
中出现的次数,是否大于在mp1
中出现的次数,如果是那么就一直移动左指针,直到不满足条件。如果两个哈希表相等,那么左指针就是一个答案 - 如果没在字符串
p
中出现过,那么左指针,直接跳到当前的下一个,并且清空哈希表mp2
。
代码
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
mp1 = [0]*27
mp2 = [0]*27
for ch in p:
mp1[ord(ch)-ord('a')]+=1
j = 0
ans = []
for i in range(len(s)):
if mp1[ord(s[i])-ord('a')]>0: # 如果这个字符在p中出现过
mp2[ord(s[i])-ord('a')]+=1 # 记录
# 直到移动到相等
while j<=i and mp2[ord(s[i])-ord('a')] > mp1[ord(s[i])-ord('a')]:
mp2[ord(s[j])-ord('a')]-=1
j+=1
if mp2==mp1:
ans.append(j)
else:
j = i + 1
mp2 = [0]*27
return ans