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

题目描述

题目解析

问题定义

在字符串 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 中单词的种类数(哈希表存储开销)
相关推荐
2401_8920709820 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
世人万千丶20 小时前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
yuzhuanhei20 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎20 小时前
LIST 的相关知识
数据结构·list
不爱吃炸鸡柳21 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
M--Y21 小时前
Redis常用数据类型
数据结构·数据库·redis
十五年专注C++开发21 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎21 小时前
STL 栈 队列
开发语言·c++
此刻觐神21 小时前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习