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
相关推荐
Merlos_wind14 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师15 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F17 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业18 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn18 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室19 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星19 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿20 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨20 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月20 小时前
map与unordered_map区别
算法·哈希算法