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

题目描述

题目解析

问题定义

在字符串 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. 滑动窗口匹配逻辑

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

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

完整代码实现:

复杂度分析
  • 时间复杂度 :O (L×N),其中 L 为 s 长度,N 为单词长度
  • 空间复杂度 :O (M),M 为 words 中单词的种类数(哈希表存储开销)
相关推荐
我是伪码农7 小时前
百蝶杯学习
学习
keyipatience8 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
hanlin038 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
一拳一个呆瓜8 小时前
【STL】文件系统导航
c++·stl
All for pursuit.8 小时前
【动态规划-21】312.戳气球
数据结构·c++·算法·leetcode·动态规划
栈帧之外8 小时前
【C++】STL之set
开发语言·c++
xian_wwq9 小时前
【学习笔记】Milvus 如何完成一次向量相似度检索,Milvus 索引到底应该怎么选?-15
笔记·学习·milvus
zhanghaha13149 小时前
C++构造函数的一些其他应用(逐词逐句保姆讲解)
c++
Hhuhkt9 小时前
3D 云养宠小游戏
学习
jimy110 小时前
c++的 Type Traits (二、更详细版本)
开发语言·c++