滑动窗口

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

哈希集合+滑动窗口,一旦出现重复进移动左指针

计算长度为:有重先去重,去完重计算右-左+1

判断后重复移动需要用到while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
s = list(s)
n = len(s)
h = dict()
if n == 0:
return 0
ans = 1
left = 0
for i in range(n):
if s[i] not in h:
h[s[i]] = 1
else:
h[s[i]] += 1
while h[s[i]] > 1:
h[s[left]] -= 1
left += 1
ans = max(ans, i-left+1)

return ans

当然,哈希集合也可以用set,判断在不在可以 i in set

顺带一提这是字节中国交易与广告算法岗的一面手撕,这个故事告诉我们hot100在快面试之前看看codetop是对的

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

滑动窗口+哈希表判断

既然都小写字母直接创两个hash来判断是否相同就行,记得**循环结束再判断一下,**因为最后一个没进循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
p = list(p)
s = list(s)
ans = []
h_p = {chr(i): 0 for i in range(97, 123)}
h_s = {chr(i): 0 for i in range(97, 123)}
if len(s) < len(p):
return ans

for i in range(len(p)):
h_p[p[i]] += 1
h_s[s[i]] += 1

index = 0

for i in range(len(p), len(s)):
if h_p == h_s:
ans.append(index)
h_s[s[index]] -= 1
h_s[s[i]] += 1
index += 1

if h_p == h_s:
ans.append(index)

return ans

站内搜索

没有找到内容!