字符串处理 —— 单模式匹配
【问题形式】
- 文本(Text):长度为 n 的数组 T[1..n]
- 模式(Pattern):一个长度为 m 且 m≤n 的数组 P[1..m]
- 有效位移/匹配点(Valid Shift):0≤s≤n-m,且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则模式 P 在文本 T 中出现且有效位移为 s,且称 s 是匹配点
单模式匹配问题,就是给出一个文本以及一个模式,找出文本中所有的匹配点。
例如:在文本 T=abcabaabcabac 中找出模式 P=abaa 的所有出现
如上图,该模式在此文本中仅出现一次,在位移 s=3 处,即 s=3 是一个匹配点
【算法】
解决字符串匹配的算法有许多,包括:朴素算法(Naive Algorithm)、Rabin-Karp 算法、有限自动机算法(Finite Automation)、 KMP 算法(Knuth-Morris-Pratt Algorithm)等等。
字符串匹配算法通常分为两个步骤:预处理(Preprocessing)、匹配(Matching),所以算法的总时间复杂度为预处理和匹配的时间复杂度的总和。
常见字符串匹配算法的时间复杂度与时间
【例题】
- Blue Jeans(POJ-3080)(暴力匹配+substr()+find()):点击这里
- Oulipo(POJ-3461)(统计模式串出现次数,可使用重复字符):点击这里
- 剪花布条(HDU-2087)(统计模式串出现次数,不能使用重复字符):点击这里
- Power Strings(POJ-2406)(求循环节个数):点击这里
- Period(POJ-1961)(求字符串前缀循环节个数):点击这里
- Seek the Name, Seek the Fame(POJ-2752)(求字符串中前缀后缀中存在循环节的子串长度):点击这里
- Count the string(HDU-3336)(求字符串前缀匹配数之和):点击这里
- Period II(FZU-1901)(求字符串前缀中存在循环节的子串个数与长度):点击这里
- Simpsons’ Hidden Talents(HDU-2594)(KMP求字符串前缀为另一字符串后缀):点击这里
- Cyclic Nacklace(HDU-3746)(补字符使字符串变为循环串):点击这里
- Carneginon(2019 ACM-ICPC 徐州赛区网络赛 D)(KMP):点击这里
- string matching(HDU-6629)(扩展KMP):点击这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】