老卫带你学---leetcode刷题(438. 找到字符串中所有字母异位词)

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

问题:

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

bash 复制代码
示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
bash 复制代码
 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
bash 复制代码
提示:

1 <= s.length, p.length <= 3 * 104
s 和 p 仅包含小写字母

解决:

直接count字符计数,然后直接比对

python 复制代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        n,m,res=len(s),len(p),[]
        if n<m:return res
        p_cnt=[0]*26
        s_cnt=[0]*26
        for i in range(m):
            p_cnt[ord(p[i])-ord('a')]+=1
            s_cnt[ord(s[i])-ord('a')]+=1
            
        if s_cnt==p_cnt:
            res.append(0)
            
        for i in range(m,n):
            s_cnt[ord(s[i-m])-ord('a')]-=1 ##每次从count中去掉旧字母
            s_cnt[ord(s[i])-ord('a')]+=1 ##每次给count中增加新字母
            if s_cnt==p_cnt: 
                res.append(i-m+1) ## 记得i-m+1
        return res
相关推荐
墨染点香5 小时前
LeetCode 刷题【126. 单词接龙 II】
算法·leetcode·职场和发展
aloha_7896 小时前
力扣hot100做题整理91-100
数据结构·算法·leetcode
Tiny番茄6 小时前
31.下一个排列
数据结构·python·算法·leetcode
码农多耕地呗8 小时前
力扣146.LRU缓存(哈希表缓存.映射+双向链表数据结构手搓.维护使用状况顺序)(java)
数据结构·leetcode·缓存
坚持编程的菜鸟12 小时前
LeetCode每日一题——三角形的最大周长
算法·leetcode·职场和发展
小欣加油15 小时前
leetcode 143 重排链表
数据结构·c++·算法·leetcode·链表
猫梦www16 小时前
力扣21:合并两个有序链表
数据结构·算法·leetcode·链表·golang·力扣
爱coding的橙子16 小时前
每日算法刷题Day76:10.19:leetcode 二叉树12道题,用时3h
算法·leetcode·职场和发展
夏鹏今天学习了吗18 小时前
【LeetCode热题100(47/100)】路径总和 III
算法·leetcode·职场和发展
smj2302_7968265218 小时前
解决leetcode第3721题最长平衡子数组II
python·算法·leetcode