LeetCode Hard:滑动窗口解决字符串子串匹配问题
1. 问题背景与核心挑战这道LeetCode Hard题目要求我们找到一个字符串中所有满足特定条件的子串起始位置。具体来说给定一个字符串s和一个单词列表words其中所有单词长度相同。我们需要找出s中所有可以由words中所有单词按任意顺序串联形成的子串的起始索引。举个例子假设s barfoothefoobarmanwords [foo, bar]。我们需要找到的子串是barfoo起始索引0和foobar起始索引9因为它们都是由words中所有单词串联而成顺序可以不同。这个问题的难点在于需要处理单词的任意排列组合所有单词必须完整出现且不重叠需要考虑滑动窗口的多种可能情况时间复杂度优化是关键暴力解法很容易超时2. 解题思路分析与算法选择2.1 暴力解法及其缺陷最直观的解法是生成words所有可能的排列组合在s中搜索每个组合的起始位置但这种方法的复杂度是O(N! * M)其中N是words长度M是s长度。当N10时10! 3,628,800显然不可行。2.2 滑动窗口与哈希表的结合更聪明的做法是采用滑动窗口配合哈希表统计计算单个单词长度word_len和总串联长度total_len创建words的频次哈希表word_count遍历s中所有可能的起始位置0到s.length()-total_len对每个起始位置检查接下来的total_len长度是否能被拆分为words的某种排列这种方法将复杂度降到了O(M * N)其中M是s长度N是words长度。2.3 进一步的优化思路我们可以通过以下优化进一步提升效率预处理words的哈希表避免重复计算利用单词长度固定的特性可以跳跃式检查当发现不匹配时立即终止当前窗口的检查3. 详细实现步骤与代码解析3.1 初始化与预处理def findSubstring(s, words): if not s or not words: return [] word_len len(words[0]) total_len word_len * len(words) word_count {} for word in words: word_count[word] word_count.get(word, 0) 1首先检查输入是否有效然后计算单个单词长度和总串联长度。创建word_count字典统计每个单词的出现次数。3.2 主循环与滑动窗口实现result [] for i in range(len(s) - total_len 1): seen {} j 0 while j len(words): word s[i j * word_len : i (j 1) * word_len] if word in word_count: seen[word] seen.get(word, 0) 1 if seen[word] word_count[word]: break else: break j 1 if j len(words): result.append(i) return result主循环遍历所有可能的起始位置。对每个位置检查接下来的total_len长度是否能拆分为words的某种排列使用seen字典记录当前窗口内单词出现次数如果某个单词出现次数超过word_count中的值立即终止如果成功检查完所有单词记录当前起始位置3.3 复杂度分析时间复杂度O(M * N)其中M是s长度N是words长度空间复杂度O(N)用于存储word_count和seen字典4. 优化方案与性能提升4.1 多起点滑动窗口优化原始解法对每个起始位置都重新检查存在重复计算。我们可以改进为def findSubstring(s, words): if not s or not words: return [] word_len len(words[0]) total_len word_len * len(words) word_count {} for word in words: word_count[word] word_count.get(word, 0) 1 result [] for k in range(word_len): left k curr_count {} count 0 for j in range(k, len(s) - word_len 1, word_len): word s[j:j word_len] if word in word_count: curr_count[word] curr_count.get(word, 0) 1 count 1 while curr_count[word] word_count[word]: left_word s[left:left word_len] curr_count[left_word] - 1 left word_len count - 1 if count len(words): result.append(left) else: curr_count.clear() count 0 left j word_len return result这种优化从不同偏移量0到word_len-1开始滑动窗口维护一个动态的窗口只在必要时移动左边界减少了重复检查平均复杂度接近O(M)4.2 边界条件处理在实际编码中需要特别注意以下边界条件输入字符串为空单词列表为空所有单词长度不一致题目已保证字符串长度小于总串联长度单词包含重复项5. 测试用例设计与验证5.1 基础测试用例# 示例1 s barfoothefoobarman words [foo,bar] # 预期输出 [0,9] # 示例2 s wordgoodgoodgoodbestword words [word,good,best,word] # 预期输出 [] # 示例3 s a words [a] # 预期输出 [0]5.2 边缘测试用例# 空输入 s words [test] # 预期输出 [] # 字符串长度不足 s short words [longword] # 预期输出 [] # 重复单词 s wordwordwordword words [word,word] # 预期输出 [0,4,8]5.3 性能测试用例# 长字符串重复模式 s a * 10000 b * 10000 words [a * 100, b * 100] # 需要验证算法效率6. 常见错误与调试技巧6.1 典型错误模式索引越界忘记检查字符串长度是否足够# 错误示例 for i in range(len(s)): # 应该减去total_len ...单词计数错误没有正确处理重复单词# 错误示例 if word in seen: # 应该比较出现次数 break窗口滑动错误移动步长不正确# 错误示例 i 1 # 应该按word_len移动6.2 调试建议打印中间变量print(fi{i}, word{word}, seen{seen})使用小测试用例逐步验证先测试单个单词的情况再测试无重复单词的情况最后测试有重复单词的复杂情况可视化滑动窗口 在纸上画出字符串和窗口移动过程有助于理解算法逻辑7. 实际应用场景与变种问题7.1 实际应用场景这种算法可以应用于基因序列中的模式查找文档中的短语搜索网络流量中的特征匹配大规模文本中的关键词检测7.2 相关变种问题允许部分匹配不要求匹配所有单词而是匹配其中若干个变长单词单词长度可以不同难度大幅增加模糊匹配允许少量字符不匹配多字符串搜索同时搜索多个不同的单词组合8. 个人解题心得与建议在解决这个问题时我总结了以下几点经验先理解再编码一定要完全理解题目要求特别是任意顺序串联的含义从暴力解法开始即使知道暴力解法不好先实现它可以帮助理解问题本质画图辅助滑动窗口问题用图示法特别有效优化要循序渐进先保证正确性再考虑优化边界测试很重要特别是空输入、极短字符串等情况容易忽略对于LeetCode练习我建议先独立思考至少30分钟写出伪代码或解题思路实现基础解法后再看讨论区的优化方案记录每道题的解题时间和遇到的问题

相关新闻

STM32F107与DP83848的工业级TCP服务器设计与优化

STM32F107与DP83848的工业级TCP服务器设计与优化

1. 项目概述:工业级TCP服务器解决方案 在工业自动化和物联网边缘计算领域,稳定可靠的网络通信是设备互联的基础。我最近完成了一个基于STM32F107微控制器和DP83848 PHY芯片的嵌入式TCP服务器项目,这套方案特别适合需要远程监控的设备网关、工…

2026/7/29 22:03:16 阅读更多 →
STM32 USB HID设备开发与调试实战指南

STM32 USB HID设备开发与调试实战指南

1. STM32 HID设备调试全流程解析在嵌入式开发领域,USB HID(Human Interface Device)协议因其免驱特性成为人机交互设备的首选方案。我最近完成了一个基于STM32的HID设备开发项目,从零开始踩遍了所有可能的坑。本文将完整呈现调试过程中的关键节点&#x…

2026/7/29 2:51:18 阅读更多 →
第二十一篇:Bridge远程会话系统,Claude Code如何实现安全的远程控制

第二十一篇:Bridge远程会话系统,Claude Code如何实现安全的远程控制

第二十一篇:Bridge 远程会话系统,Claude Code 如何实现安全的远程控制 本文是《Claude Code 源码分析 100 篇》系列的第二十一篇。前一篇我们分析了 MCP 协议集成,本篇深入 Bridge 系统——这是 Claude Code 实现远程控制、跨设备协作的核心模…

2026/7/29 14:43:49 阅读更多 →

最新新闻

孕酮(PG):核心生殖调节激素,云克隆 ELISA 试剂盒助力内分泌与生殖医学精准检测

孕酮(PG):核心生殖调节激素,云克隆 ELISA 试剂盒助力内分泌与生殖医学精准检测

一、孕酮(PG)的生物学背景与科研核心价值孕酮(Progesterone,PG,黄体酮)是一类由胆固醇衍生而来的脂溶性甾体小分子激素,是雌性生殖内分泌系统最核心的功能调控激素之一,在卵泡发育、…

2026/7/30 9:28:48 阅读更多 →
SpringBoot自动配置原理与实战指南

SpringBoot自动配置原理与实战指南

1. SpringBoot自动配置的魔法背后当你在IDEA中新建一个SpringBoot项目时,只需勾选几个starter依赖,就能直接使用数据库连接、Web服务等复杂功能。这种"开箱即用"的体验背后,正是SpringBoot自动配置机制在发挥作用。作为SpringBoot最…

2026/7/30 9:28:48 阅读更多 →
LangChain与RAG实战:本地部署大模型应用开发指南

LangChain与RAG实战:本地部署大模型应用开发指南

1. 先搞清楚这套组合到底解决什么问题 如果你正在接触大模型应用开发,大概率会听到 LangChain、RAG、Ollama、Agent 这几个词混在一起出现。这套组合最核心的价值是让开发者能在普通机器上,用相对可控的成本搭建具备专业知识问答、逻辑推理和任务执行能力…

2026/7/30 9:28:48 阅读更多 →
JetBrains IDE试用重置终极指南:简单三步实现无限期免费使用

JetBrains IDE试用重置终极指南:简单三步实现无限期免费使用

JetBrains IDE试用重置终极指南:简单三步实现无限期免费使用 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为JetBrains IDE的30天试用期到期而烦恼吗?今天我要为你介绍一个神奇的开源…

2026/7/30 9:28:48 阅读更多 →
SEO优化实战指南:从基础到进阶的核心策略

SEO优化实战指南:从基础到进阶的核心策略

1. 为什么SEO仍然是网站流量的核心引擎 在互联网流量成本持续攀升的今天,SEO(搜索引擎优化)依然是获取精准流量的性价比之王。我运营过十几个不同行业的网站,发现即便是付费广告投放成熟的电商站点,自然搜索流量仍占总…

2026/7/30 9:28:48 阅读更多 →
2026年小程序开发:原生还是框架?

2026年小程序开发:原生还是框架?

一场效率与体验的博弈引言2026年,小程序已经从"轻量化替代方案"成长为很多企业数字化转型的标配。无论是电商零售、餐饮外卖、政务办事还是在线教育,几乎每一个高频场景都能看到小程序的身影。但当我们真正启动一个新项目时,摆在技…

2026/7/30 9:27:48 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻