LeetCode热题100-找到字符串中所有字母异位词

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

通过阅读题目首先想到的就是通过排序判断是否为异位词子串,但是这提交会出超时,时间复杂度较高(O (n×m log m)

python 复制代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        if not s:
            return []
        
        def isequal(s1: str, s2: str):
            s1_tmp = sorted(s1)
            s2_tmp = sorted(s2)
            return s1_tmp == s2_tmp
        
        res = []
        length = len(p)
        i = 0
        while i < len(s):
            right = i + length -1
            if right + 1 <= len(s) and isequal(s[i:right+1], p):
                res.append(i)
            i += 1
        
        return res

这里使用滑动窗口 + 哈希表计数,因为只需要判断字符个数一致即为异位词,所以只需要使用哈希表保证窗口内和给定p哈希表一致就说明一样,这里使用普通的字典,使用defaultdict比较方便,因为会自动初始化为0,省去判断字典是否存在。

python 复制代码
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        len_s = len(s)
        len_p = len(p)
        if len_s < len_p:
            return []
        
        p_dict, w_dict = {}, {}
        for c in p:
            if c in p_dict:
                p_dict[c] += 1
                continue
            p_dict[c] = 1
        
        for c in s[:len_p]:
            if c in w_dict:
                w_dict[c] += 1
                continue
            w_dict[c] = 1
        
        res = []
        if w_dict == p_dict:
            res.append(0)
        
        for i in range(len_p, len_s):
            left_char = s[i - len_p]
            w_dict[left_char] -= 1
            if w_dict[left_char] == 0:
                del w_dict[left_char]
            
            right_char = s[i]
            if right_char in w_dict:
                w_dict[right_char] += 1
            else:
                w_dict[right_char] = 1
            
            if w_dict == p_dict:
                res.append(i - len_p + 1)
        
        return res
python 复制代码
from collections import defaultdict

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        len_s = len(s)
        len_p = len(p)
        if len_s < len_p:
            return []
        
        p_dict, w_dict = defaultdict(int), defaultdict(int)
        for c in p:
            p_dict[c] += 1
        
        for c in s[:len_p]:
           w_dict[c] += 1
        
        res = []
        if w_dict == p_dict:
            res.append(0)
        
        for i in range(len_p, len_s):
            left_char = s[i - len_p]
            w_dict[left_char] -= 1
            if w_dict[left_char] == 0:
                del w_dict[left_char]
            
            right_char = s[i]
            w_dict[right_char] += 1
            
            if w_dict == p_dict:
                res.append(i - len_p + 1)
        
        return res
相关推荐
ValhallaCoder1 天前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
泡沫冰@1 天前
GO 语言基础
开发语言·算法·golang
luj_17681 天前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场1 天前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
马可家的菠萝1 天前
Vue3 + Canvas 手绘笔记工程化实践:别把画布只当成一张 PNG
前端·vue.js·算法
watersink1 天前
机器学习极大似然估计与EM算法
人工智能·算法·机器学习
叠层归一研究院1 天前
如何用程序搭建一个 AGI 种子系统(一):从向量种子到无限生长引擎
人工智能·python·算法·机器学习·agi
科学实验家1 天前
并 查集
算法
AI服务老曹1 天前
视觉算法模型管理性能优化指南:多版本平滑升级、灰度与快速回滚实战
算法·性能优化
l1258651 天前
# RAG重排序实战:硅基流动bge-reranker-v2-m3在线API vs 本地CrossEncoder,一篇讲透两种方案
数据库·人工智能·python·深度学习·算法·机器学习·langchain