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