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

题目描述

题目解析

问题定义

在字符串 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 中单词的种类数(哈希表存储开销)
相关推荐
咩咦12 小时前
C++学习笔记20:日期类比较运算符重载
c++·学习笔记·类和对象·运算符重载·比较运算符·日期类
凌波粒12 小时前
LeetCode--404.左叶子之和(二叉树)
算法·leetcode·职场和发展
paeamecium13 小时前
【PAT甲级真题】- A+B in Hogwarts
c++·算法·pat考试·pat
小新同学^O^13 小时前
简单学习 --> LangChain
python·学习·langchain
青山师13 小时前
二叉树与BST深度解析:遍历算法与平衡策略
数据结构·算法·面试·二叉树·算法与数据结构·java面试·数据结构与算法分析
绝知此事13 小时前
【算法突围 03】核心算法思想:分治/递归/动态规划与 LeetCode 高频真题解析
算法·leetcode·面试·动态规划
AI科技星13 小时前
第二章 平行素数对网格:矩形→等腰梯形拓扑变换(完整公理终稿)
c语言·开发语言·线性代数·算法·量子计算·agi
咩咦13 小时前
C++学习笔记16:构造函数
c++·学习笔记·类和对象·构造函数·默认构造函数