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

题目描述

题目解析

问题定义

在字符串 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 中单词的种类数(哈希表存储开销)
相关推荐
d111111111d12 分钟前
STM32外设学习--PWR电源控制
笔记·stm32·单片机·嵌入式硬件·学习
筱砚.13 分钟前
【C++——文件操作案例】
开发语言·c++
jackaso14 分钟前
ES6 学习笔记2
前端·学习·es6
得物技术15 分钟前
项目性能优化实践:深入FMP算法原理探索|得物技术
前端·算法
FMRbpm16 分钟前
STL中栈的实现
数据结构·c++·算法
不羁的木木17 分钟前
【开源鸿蒙跨平台开发学习笔记】Day06:React Native 在 OpenHarmony 开发中的自定义组件开发
笔记·学习·harmonyos
roman_日积跬步-终至千里18 分钟前
【模式识别与机器学习(3)】主要算法与技术(中篇:概率统计与回归方法)之贝叶斯方法(Bayesian)
算法·机器学习·回归
sulikey18 分钟前
C/C++内存管理深度解析:从内存分布到new/delete底层原理
c语言·c++·内存管理·placement-new
a***813920 分钟前
【Go】Go语言基础学习(Go安装配置、基础语法)
服务器·学习·golang
AI科技星21 分钟前
加速正电荷产生的电场、引力场与磁场变化率方向关系的数学求导验证——基于张祥前统一场论核心方程
数据结构·人工智能·经验分享·算法·机器学习·计算机视觉