字符串处理 —— 单模式匹配

【问题形式】

  • 文本(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),所以算法的总时间复杂度为预处理和匹配的时间复杂度的总和。

常见字符串匹配算法的时间复杂度与时间

字符串处理 —— 单模式匹配_第1张图片字符串处理 —— 单模式匹配_第2张图片

  • 朴素的字符串匹配算法(Brute Force Algorithm):点击这里
  • KMP 算法(Knuth-Morris-Pratt Algorithm):点击这里

【例题】

  • 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):点击这里

你可能感兴趣的:(—————字符串处理—————)