news 2026/5/7 18:04:30

蓝桥杯‘子串简写’题别再用暴力了!手把手教你二分优化,效率提升百倍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝桥杯‘子串简写’题别再用暴力了!手把手教你二分优化,效率提升百倍

蓝桥杯‘子串简写’题:从暴力枚举到二分优化的思维跃迁

第一次参加蓝桥杯时,我盯着那道"子串简写"的题目整整半小时毫无头绪。直到比赛结束前才勉强写出暴力解法,结果自然是超时。后来复盘时才恍然大悟:原来只需要一个简单的二分查找,就能让效率提升百倍。本文将带你完整重现这个思维升级的过程。

1. 问题本质与暴力解法剖析

题目要求统计字符串中所有满足特定条件的子串数量:子串首字符为c1,尾字符为c2,且长度≥k。表面看这似乎需要检查所有可能的子串组合,但深入分析会发现隐藏的优化空间。

暴力解法的核心代码如下:

for(int i = 0; i < s.size(); i++) { if(s[i] != c1) continue; for(int j = i + 1; j < s.size(); j++) { if(j - i + 1 >= k && s[j] == c2) ans++; } }

这种双重循环的时间复杂度是O(n²),当n达到10⁵时必然超时。但仔细观察会发现内层循环其实在做重复工作——每次遇到c1时,都在重新扫描整个后续字符串寻找c2。

暴力解法的三大痛点

  1. 重复扫描:对每个c1都重新检查后续所有字符
  2. 无效计算:即使知道后续c2的位置,仍逐个检查
  3. 缺乏预处理:没有利用字符串的静态特性

2. 优化思路的突破口

关键在于发现两个重要特征:

  1. c2的位置是固定的,与当前c1无关
  2. 对每个c2,我们只需要知道前面有多少个c1满足位置差≥k-1

这提示我们可以:

  • 预处理记录所有c1的位置
  • 对每个c2,在c1位置数组中快速统计满足条件的数量

优化思路演进表

思考阶段关键发现潜在解法时间复杂度
初始暴力必须检查所有子串双重循环O(n²)
第一次优化c2位置固定记录c1位置O(n*m)
最终突破位置有序可二分二分查找统计O(n log m)

3. 二分查找的精妙应用

预处理阶段我们用一个数组pc1按顺序存储所有c1的位置。对于每个c2的位置j,我们需要统计pc1中有多少元素≤j-k+1。

vector<int> pc1; // 存储c1的位置 for(int i = 0; i < s.size(); i++) { if(s[i] == c1) pc1.push_back(i); if(s[i] == c2) { if(i - k + 1 < 0 || pc1.empty()) continue; int target = i - k + 1; // 二分查找pc1中≤target的最大索引 int l = 0, r = pc1.size() - 1; while(l < r) { int mid = (l + r + 1) >> 1; if(pc1[mid] <= target) l = mid; else r = mid - 1; } if(pc1[l] <= target) ans += (l + 1); } }

这段代码有几个关键点:

  1. pc1数组天然有序,满足二分查找前提
  2. 使用mid = (l + r + 1) >> 1确保不会死循环
  3. 最终检查pc1[l] <= target避免边界错误

4. 复杂度分析与性能对比

假设字符串中c1出现m次,c2出现n次:

方法时间复杂度空间复杂度10⁵数据耗时
暴力O(n²)O(1)>10秒
预处理+线性扫描O(n*m)O(m)~1秒
预处理+二分查找O(n log m)O(m)<0.01秒

实际测试中,当n=10⁵时:

  • 暴力解法无法在合理时间内完成
  • 二分优化版本仅需约15ms

5. 调试技巧与常见陷阱

实现二分查找时容易遇到以下问题:

边界条件处理

  • 空pc1数组情况
  • 所有c1位置都大于target
  • 所有c1位置都小于target

二分查找变体选择

  • 这里需要找最后一个≤target的元素
  • 使用mid = (l + r + 1) >> 1而非mid = (l + r) >> 1
  • 循环条件while(l < r)而非while(l <= r)

调试小技巧

  1. 先写暴力解法作为正确性验证
  2. 对小样例打印pc1数组和二分过程
  3. 测试极端情况:k=1,全c1,全c2等

6. 思维拓展与其他应用场景

这种"预处理+二分统计"的模式适用于许多字符串问题:

  1. 区间统计问题:统计满足某种区间条件的元素对
  2. 最近邻查找:快速找到距离某个位置最近的特定字符
  3. 频率统计:统计特定字符在某个区间内的出现次数

例如LeetCode 792题"匹配子序列",就可以用类似的思路将时间复杂度从O(n²)优化到O(n log m)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 18:04:28

如何快速找回忘记的压缩包密码:ArchivePasswordTestTool 实用指南

如何快速找回忘记的压缩包密码&#xff1a;ArchivePasswordTestTool 实用指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经因…

作者头像 李华
网站建设 2026/5/7 18:01:54

打造你的专属AI助手:NextChat让智能对话触手可及

打造你的专属AI助手&#xff1a;NextChat让智能对话触手可及 【免费下载链接】ChatGPT-Next-Web ✨ Light and Fast AI Assistant. Support: Web | iOS | MacOS | Android | Linux | Windows 项目地址: https://gitcode.com/GitHub_Trending/ch/ChatGPT-Next-Web 你是否…

作者头像 李华
网站建设 2026/5/7 17:59:28

汽车吃胎、方向跑偏根源解析:别再盲目换胎,底盘才是关键

开车时经常遇到这样的困扰&#xff1a;方向盘明明已经回正&#xff0c;车辆却会自动偏向一侧&#xff0c;高速行驶时必须用力握紧方向盘才能保持直行&#xff1b;轮胎刚更换不久&#xff0c;还没跑多少公里&#xff0c;就出现单侧花纹磨损严重、一侧光滑一侧深厚的情况——这就…

作者头像 李华
网站建设 2026/5/7 17:57:54

3个实战场景:RTL8821CU无线网卡Linux驱动完整解决方案

3个实战场景&#xff1a;RTL8821CU无线网卡Linux驱动完整解决方案 【免费下载链接】rtl8821CU Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8821CU RTL8821CU是一款广泛使用的Realtek USB无线网卡…

作者头像 李华
网站建设 2026/5/7 17:57:43

【往届快至会后2.5个月EI检索】第二届地球物理与勘探开发国际学术会议(ICGED 2026)

全球资源的可持续开发与环境保护已经成为当今社会的重要主题。地球物理技术作为资源勘探与开发的重要手段&#xff0c;正在不断寻求创新与完善。为了应对未来能源需求和环境挑战&#xff0c;第二届地球物理与勘探开发国际学术会议 (ICGED 2026) 将于2026年5月15-17日在青岛召开…

作者头像 李华