题目
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab" 输出: [0,1,2] 解释: 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
提示:
1 <= s.length, p.length <= 3 * 104
s
和p
仅包含小写字母
题解
生成两个字母表,在字母上进行比对,初始都是26个0,分别对应a,b,c,d,e,f,g,....,z,
初始要有三个值,后续仅将最左边窗口值更新为零,依次滑动窗口。
例如 输入: s = "cbaebabacd", p = "abc" 输出: [0,6]
list_p 是 [1,1,1,0,0,0,0,...,0]
第一轮list_s = [1,1,1,0,0,...,0] 然后滑动窗口,list_s = [0,1,1,0,0,...,0]
第二轮list_s = [0,1,1,0,1,...,0] 不等于 list_p
以此类推...
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
meta = ord('a')
list_p = [0] * 26
list_s = [0] * 26
res = []
for i in range(len(p)):
list_p[ord(p[i]) - meta] += 1
for i in range(len(s)):
list_s[ord(s[i]) - meta] += 1
if i < len(p) - 1:
continue
if list_s == list_p:
res.append(i - len(p) + 1)
list_s[ord(s[i - len(p) + 1]) - meta] -= 1
return res