当前位置: 首页 > news >正文

经典算法题详解之统计重复个数(二)

​解决方案

思路

由于题目中的 n1 和 n2 都很大,因此我们无法真正把 S1 = [s1, n1] 和 S2 = [s2, n2] 都显式地表示出来。由于这两个字符串都是不断循环的,因此我们可以考虑找出 s2 在 S1 中出现的循环节,如果我们找到了循环节,那么我们就可以很快算出 s2 在 S1 中出现了多少次了。

有些读者可能对循环节这个概念会有些陌生,这个概念我们可以类比无限循环小数,如果从小数部分的某一位起向右进行到某一位止的一节数字「循环」出现,首尾衔接,称这种小数为「无限循环小数」,这一节数字称为「无限循环小数」。比如对于 3.56789789789... 这个无限循环小数,它的小数部分就是以 789 为一个「循环节」在无限循环,且开头可能会有部分不循环的部分,这个数字中即为 56。

那么回到这题,我们可以将不断循环的 s2 组成的字符串类比作上面小数部分,去找是否存在一个子串,即「循环节」,满足不断在 S2 中循环,且这个循环节能对应固定数量的 s1 。如下图所示,在第一次出现后,S2 的子串 bdadc 构成一个循环节:之后 bdadc 的每次出现都需要有相应的两段 s1。

当我们找出循环节后,我们即可知道一个循环节内包含 s1 的数量,以及在循环节出现前的 s1 的数量,这样就可以在 O(1) 的时间内,通过简单的运算求出 s2 在 S1 中出现的次数了。当然,由于 S1 中 s1 的数量 n1 是有限的,因此可能会存在循环节最后一个部分没有完全匹配,如上图最后会单独剩一个 s1 出来无法完全匹配完循环节,这部分我们需要单独拿出来遍历处理统计。

有些读者可能会怀疑循环节是否一定存在,这里我们给出的答案是肯定的,根据鸽笼原理,我们最多只要找过 |s2| + 1 个 s1,就一定会出现循环节。

http://www.cnnetsun.cn/news/32919.html

相关文章:

  • 5分钟掌握NeuTTS Air:嵌入式设备语音克隆终极指南
  • 3个关键步骤解决Waymo E2E数据集时序数据访问难题
  • 14、深入解析 Apache 服务器安全、功能与故障排查
  • 15、深入探索Gnutella网络:问题、优化与政策考量
  • 2025年厦门市小学生信息学竞赛C++(初赛)真题-附答案
  • 5步打造智能新闻收集助手:基于Agently框架的自动化解决方案
  • local-web-server 终极使用指南:5个新手必学技巧
  • 320亿参数大模型单GPU部署:IBM Granite-4.0量化版改写企业AI规则
  • 沉浸式翻译扩展无法启动的7个修复技巧
  • Czkawka深度实战手册:macOS存储空间优化终极指南
  • BiliFM:三分钟学会B站音频批量下载终极指南
  • 如何快速搭建intl-tel-input开发环境:从Grunt到Jest的完整指南
  • HCIA-Cloud Computing 云计算认证终极指南:7大核心模块完整教程
  • SongGeneration实战教程:5分钟快速上手AI音乐创作
  • SAWS模糊匹配:AWS资源管理的智能搜索革命
  • AWS-Nuke 终极指南:彻底清理AWS账户的完整教程
  • Python性能测试终极指南:用pyperf工具包提升代码效率
  • InterviewThis:开发者面试必备的全面评估指南,助你找到理想工作环境
  • 5分钟快速上手:Yaak桌面API客户端终极使用指南
  • Intel RealSense深度相机标定完全指南:从基础到高级参数调整
  • 在线教育学习|基于java + vue在线教育学习系统(源码+数据库+文档)
  • 350万美元颠覆千亿模型格局:Cogito v2 109B MoE开启开源效率革命
  • 出行旅游安排|基于springboot出行旅游安排系统(源码+数据库+文档)
  • 学生管理|基于springboot学生管理系统(源码+数据库+文档)
  • 酒店预约|基于springboot 酒店预约系统(源码+数据库+文档)
  • K8s API Server:集群的大脑
  • 10、Samba网络服务:NetBIOS名称解析与浏览功能详解
  • 13、Samba文件与打印共享配置全解析
  • 6、SELinux 策略配置与 Web 应用限制实践
  • 17、SELinux调试与审计全解析