老卫带你学---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
相关推荐
爱coding的橙子9 小时前
每日算法刷题Day63:8.19:leetcode 堆6道题,用时1h50min
算法·leetcode·职场和发展
岁忧9 小时前
(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
java·c++·算法·leetcode·矩阵·go·动态规划
Davis_121911 小时前
代码随想录算法训练营27天 | 56. 合并区间、738.单调递增的数字、968.监控二叉树(提高)
数据结构·c++·算法·leetcode·贪心算法
农场主John13 小时前
(栈)Leetcode155最小栈+739每日温度
windows·python·算法·leetcode·
杜子不疼.16 小时前
【LeetCode 415】—字符串相加算法详解
算法·leetcode·职场和发展
仙俊红16 小时前
LeetCode每日一题,2025-08-21
算法·leetcode·职场和发展
一起努力啊~17 小时前
算法题打卡力扣第34题:在排序数组中查找元素的第一个和最后一个位置(mid)
数据结构·算法·leetcode
1白天的黑夜118 小时前
链表-143.重排链表-力扣(LeetCode)
数据结构·leetcode·链表
快去睡觉~1 天前
力扣73:矩阵置零
算法·leetcode·矩阵
岁忧1 天前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先