老卫带你学---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
相关推荐
chengooooooo6 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GalaxyPokemon9 小时前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展
hn小菜鸡10 小时前
LeetCode 1356.根据数字二进制下1的数目排序
数据结构·算法·leetcode
zhuiQiuMX10 小时前
分享今天做的力扣SQL题
sql·算法·leetcode
全栈凯哥12 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
全栈凯哥12 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
SuperCandyXu12 小时前
leetcode2368. 受限条件下可到达节点的数目-medium
数据结构·c++·算法·leetcode
蒟蒻小袁14 小时前
力扣面试150题--被围绕的区域
leetcode·面试·深度优先
GalaxyPokemon15 小时前
LeetCode - 148. 排序链表
linux·算法·leetcode
chao_78917 小时前
链表题解——环形链表 II【LeetCode】
数据结构·leetcode·链表