[优选算法专题二滑动窗口——串联所有单词的子串]

题目描述

题目解析

问题定义

在字符串 s 中寻找所有满足以下条件的子串起始索引:

  • 子串由 words 数组中所有单词无重复、无遗漏地串联而成
  • 子串中单词顺序可任意排列
核心解题策略:滑动窗口 + 哈希表

通过滑动窗口 控制子串范围,用哈希表统计单词频次,实现高效匹配。

关键步骤解析
  1. 预处理阶段

    • 构建基准哈希表 :用 hash1 存储 **words**中每个单词的出现次数(作为匹配标准)
    • 计算关键参数
      • word_len:单个单词长度(题目保证所有单词长度相同)
      • window_len:目标子串总长度 = word_len × words.size()
  2. 分组遍历策略

    • 外层循环 for(int i=0; i<word_len; i++)
      • 因单词长度固定,目标子串的起始位置只能是 i, i+word_len, i+2×word_len...
      • word_len 组处理,覆盖所有可能的起始偏移,避免重复检查
  3. 滑动窗口匹配逻辑

    • 窗口维护 :用 leftright 指针控制窗口范围,每次移动 word_len
    • 动态哈希表hash2 实时记录当前窗口内的单词频次
    • 匹配计数器match 统计与 hash1 频次一致的单词种类数
  4. 窗口调整规则

    • 扩展窗口 :右指针右移,将新单词加入 hash2,若频次匹配则 match++
    • 收缩窗口 :当窗口长度超过 window_len 时,左指针右移,移除左侧单词,若频次不匹配则 match--
    • 有效判断 :当 match 等于 hash1 中单词种类数时,记录 left 为有效起始索引

完整代码实现:

复杂度分析
  • 时间复杂度 :O (L×N),其中 L 为 s 长度,N 为单词长度
  • 空间复杂度 :O (M),M 为 words 中单词的种类数(哈希表存储开销)
相关推荐
IronMurphy4 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬4 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership4 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826524 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
山甫aa5 小时前
差分数组 ----- 从零开始的数据结构
数据结构
酿情师5 小时前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
早日退休!!!5 小时前
《数据结构选型指南》笔记
数据结构·数据库·oracle
Beginner x_u5 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
丑八怪大丑5 小时前
Java数据结构与集合源码
数据结构
瞎某某Blinder6 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法