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
相关推荐
To_OC8 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495649 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
醇氧11 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
爱刷碗的苏泓舒13 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
谙弆悕博士14 小时前
系统集成项目管理工程师教程(第3版)笔记——第17章:法律法规和标准规范
笔记·职场和发展·学习方法·业界资讯·软考·法律·法规
烬羽15 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米15 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠16 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA18 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务