【滑动窗口】No. 0438 找到字符串中所有字母异位词【中等】👉力扣对应题目指路
![](https://i-blog.csdnimg.cn/direct/53543a8b255e4c448d799a2bc1475df5.png)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序
-
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)
-
示例 1:
输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词
🔥 思路:滑动窗口,逐个比较当前窗口内的
s
片段 是不是p
的异位词
- 用
列表
而非字典来统计字符串中各元素出现的频率:字典比较时不方便
- 用
ord(num)-97
(ASCII 码 - 97) 作为索引位置
参考如上思路,给出详细步骤如下:
- 步骤一⭐确定滑动窗口的范围
0 ~ len(s)-len(p)
- 注意边界取不取一定弄对!
[0, len(s)-len(p))
- 步骤二⭐移动窗口
- 步骤二⭐更新结果
- 把没找到的放入结果列表
result
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
def fill_count(nums):
nums_count = [0 for _ in range(26)]
for num in nums:
nums_count[ord(num)-97] += 1
return nums_count
if len(p) > len(s): return []
p_count = fill_count(p)
s_count = fill_count(s[:len(p)])
result = [0] if p_count == s_count else []
for i in range(len(s)-len(p)): # ---------------- step 1
s_count[ord(s[i])-97] -= 1
s_count[ord(s[i+len(p)])-97] += 1
if p_count == s_count: # ------------------- step 2
result.append(i+1) # -------------------- step 3
return result
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100