KMP算法

合集下载

kmp算法原理

kmp算法原理

kmp算法原理KMP算法(Knuth-Morris-Pratt算法)是一种用于快速搜索字符串中某个模式字符串出现位置的算法,由Knuth, Morris 和 Pratt于1977年提出。

KMP算法的工作方式如下:首先,给定一个主串S和一个模式串P,KMP算法的第一步就是先构造一个新的模式串P,其中的每一项存储着P中每一个字符前面由不同字符串组成的最长前缀和最长后缀相同的子串。

接着,在S中寻找P,它会从S的第一个字符开始,如果匹配上,就继续比较下一个字符,如果不匹配上,就根据P中相应位置上保存的信息跳到特定位置,接着再开始比较,如此不断循环下去,直到从S中找到P为止。

KMP算法的思路特别巧妙,比较效率很高,它的复杂度为O(m+n),其中m为主串的长度,n为模式串的长度。

它取代了以前的暴力搜索算法,极大地提高了程序的性能。

KMP算法的实现过程如下:(1)首先确定模式串P的每一个字符,构造模式串P的next数组:next[i]存储P中第i个字符之前最长相同前缀和后缀的长度(P中第i个字符之前最长相同前缀和后缀不包括第i个字符);(2)接着从S中的第一个字符开始比较P中的每一个字符,如果字符不匹配,则采用next数组中保存的信息跳到特定位置,而不是暴力比较,以此不断循环,直到从S中找到P为止。

KMP算法是由Don Knuth, Vaughan Pratt和James Morris在1977年提出的。

它的思想是利用之前遍历过的P的信息,跳过暴力比较,可以把字符串搜索时间从O(m×n)降低到O(m+n)。

KMP算法在很多领域有着重要的应用,如文本编辑,模式匹配,编译器设计与多项式字符串匹配等等,都是不可或缺的。

KMP算法实现及优化方法

KMP算法实现及优化方法

KMP算法实现及优化方法KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,用于在一个主文本字符串S内查找一个模式字符串P的出现位置。

KMP算法利用模式字符串中前缀和后缀的信息来跳过不必要的比较,从而提高查找的效率。

KMP算法的基本思想是,当出现不匹配时,通过已经部分匹配的信息,可以确定一部分字符是匹配的,可以直接跳过这部分已经匹配的字符,继续进行比较。

这个部分匹配的信息,就是模式字符串P自身的前缀和后缀的最长共有元素的长度,也称为前缀函数或部分匹配表。

1.构建部分匹配表:对模式字符串P进行分析,计算出每个位置的最长共有元素的长度,存储在一个部分匹配表中。

2.在主文本字符串S中进行匹配:从主文本字符串的第一个位置开始,逐个字符与模式字符串进行比较,如果字符相等则继续比较下一个字符,如果字符不相等,则根据部分匹配表跳过一部分字符,继续比较,直到找到匹配的位置或者比较结束。

优化KMP算法可以从两方面进行:1.改进部分匹配表的构建:KMP算法中最耗时的部分是部分匹配表的构建,可以对其进行优化。

一种优化方法是使用动态规划思想,利用已计算的部分匹配值来计算新的部分匹配值,从而减少计算量。

2.改进模式字符串的跳过方式:KMP算法中,当在主文本字符串S中比较到一些位置时,如果字符不匹配,则根据部分匹配表来跳过一部分字符。

可以根据具体问题的特点,利用更加有效的跳过方式来提高算法的效率。

一种常见的跳过方式是使用好后缀和坏字符的信息,来决定向右移动的步数。

总结起来,KMP算法是一种高效的字符串匹配算法,通过部分匹配表的构建和优化,可以在O(n+m)的复杂度内完成匹配。

在实际应用中,根据具体问题的特点,可以进一步改进KMP算法来提高效率。

严蔚敏 数据结构 kmp算法详解

严蔚敏 数据结构 kmp算法详解
max{k|0<k<j,且“t0t1…tk-1”=“tj-ktj-k+1…tj-1” }
当此集合非空时
next[j]= -1 0 当j=0时 其他情况
t=“abab”对应的next数组如下:
j t[j] next[j] 0 a -1 1 b 0 2 a 0 3 b 1
void GetNext(SqString t,int next[]) { int j,k; j=0;k=-1;next[0]=-1; while (j<t.len-1)
既然如此,回溯到si-j+1开始与t匹配可以不做。那 么,回溯到si-j+2 开始与t匹配又怎么样?从上面推理 可知,如果 "t0t1…tj-2"≠"t2t3…tj"
仍然有
"t0t1…tj-2"≠"si-j+2si-j+3…si"
这样的比较仍然“失配”。依此类推,直到对于 某一个值k,使得: "t0t1…tk-2"≠" tj-k+1tj-k+2…tj-1"
b 3
第 1 次匹配
第 2 次匹配
s=aaabaaaa b t=aaaab
第 3 次匹配
s=aaabaaaa b t=aaaab
第 4 次匹配
s=aaabaaaa b t=aaaab
第 5 次匹配
s=aaabaaaa b t=aaaab
上述定义的next[]在某些情况下尚有缺陷。 例如,模式“aaaab”在和主串“aaabaaaab”匹配时, 当i=3,j=3时,s.data[3]≠t.data[3],由next[j]的指示还需 进行i=3、j=2,i=3、j=1,i=3、j=0等三次比较。实际上, 因为模式中的第1、2、3个字符和第4个字符都相等, 因此,不需要再和主串中第4个字符相比较,而可以将模 式一次向右滑动4个字符的位置直接进行i=4,j=0时的 字符比较。

kmp算法概念

kmp算法概念

kmp算法概念KMP算法概念KMP算法是一种字符串匹配算法,它的全称是Knuth-Morris-Pratt 算法。

该算法通过预处理模式串,使得在匹配过程中避免重复比较已经比较过的字符,从而提高了匹配效率。

一、基本思想KMP算法的基本思想是:当模式串与文本串不匹配时,不需要回溯到文本串中已经比较过的位置重新开始匹配,而是利用已知信息跳过这些位置继续匹配。

这个已知信息就是模式串自身的特点。

二、next数组1.定义next数组是KMP算法中最核心的概念之一。

它表示在模式串中当前字符之前的子串中,有多大长度的相同前缀后缀。

2.求解方法通过观察模式串可以发现,在每个位置上出现了相同前缀和后缀。

例如,在模式串“ABCDABD”中,第一个字符“A”没有任何前缀和后缀;第二个字符“B”的前缀为空,后缀为“A”;第三个字符“C”的前缀为“AB”,后缀为“B”;第四个字符“D”的前缀为“ABC”,后缀为“AB”;第五个字符“A”的前缀为“ABCD”,后缀为“ABC”;第六个字符“B”的前缀为“ABCDA”,后缀为“ABCD”;第七个字符“D”的前缀为“ABCDAB”,后缀为“ABCDA”。

根据上述观察结果,可以得到一个求解next数组的方法:(1)next[0]=-1,next[1]=0。

(2)对于i=2,3,...,m-1,求解next[i]。

①如果p[j]=p[next[j]],则next[i]=next[j]+1。

②如果p[j]≠p[next[j]],则令j=next[j],继续比较p[i]和p[j]。

③重复执行步骤①和步骤②,直到找到满足条件的j或者j=-1。

(3)通过上述方法求解出所有的next值。

三、匹配过程在匹配过程中,文本串从左往右依次与模式串进行比较。

如果当前字符匹配成功,那么继续比较下一个字符;否则利用已知信息跳过一些位置继续进行匹配。

具体地:(1)如果当前字符匹配成功,则i和j都加1。

(2)如果当前字符匹配失败,则令j=next[j]。

KMP算法(改进的模式匹配算法)——next函数

KMP算法(改进的模式匹配算法)——next函数

KMP算法(改进的模式匹配算法)——next函数KMP算法简介KMP算法是在基础的模式匹配算法的基础上进⾏改进得到的算法,改进之处在于:每当匹配过程中出现相⽐较的字符不相等时,不需要回退主串的字符位置指针,⽽是利⽤已经得到的部分匹配结果将模式串向右“滑动”尽可能远的距离,再继续进⾏⽐较。

在KMP算法中,依据模式串的next函数值实现字串的滑动,本随笔介绍next函数值如何求解。

next[ j ]求解将 j-1 对应的串与next[ j-1 ]对应的串进⾏⽐较,若相等,则next[ j ]=next[ j-1 ]+1;若不相等,则将 j-1 对应的串与next[ next[ j-1 ]]对应的串进⾏⽐较,⼀直重复直到相等,若都不相等则为其他情况题1在字符串的KMP模式匹配算法中,需先求解模式串的函数值,期定义如下式所⽰,j表⽰模式串中字符的序号(从1开始)。

若模式串p 为“abaac”,则其next函数值为()。

解:j=1,由式⼦得出next[1]=0;j=2,由式⼦可知1<k<2,不存在k,所以为其他情况即next[2]=1;j=3,j-1=2 对应的串为b,next[2]=1,对应的串为a,b≠a,那么将与next[next[2]]=0对应的串进⾏⽐较,0没有对应的串,所以为其他情况,也即next[3]=1;j=4,j-1=3 对应的串为a,next[3]=1,对应的串为a,a=a,所以next[4]=next[3]+1=2;j=5,j-1=4 对应的串为a,next[4]=2,对应的串为b,a≠b,那么将与next[next[4]]=1对应的串进⾏⽐较,1对应的串为a,a=a,所以next[5]=next[2]+1=2;综上,next函数值为 01122。

题2在字符串的KMP模式匹配算法中,需先求解模式串的函数值,期定义如下式所⽰,j表⽰模式串中字符的序号(从1开始)。

若模式串p为“tttfttt”,则其next函数值为()。

KMP算法的时间复杂度

KMP算法的时间复杂度

KMP算法的时间复杂度KMP算法是一种字符串匹配算法,它可以在一个主串中高效地查找所有匹配某个模式串的位置。

在计算机科学中,算法的时间复杂度是衡量算法执行时间与输入规模之间关系的度量。

在本文中,我们将深入探讨KMP算法的时间复杂度。

KMP算法的时间复杂度可通过三个方面来分析:预处理阶段的时间复杂度、匹配阶段的时间复杂度以及总体时间复杂度。

1. 预处理阶段的时间复杂度在KMP算法中,要先对模式串进行预处理,生成部分匹配表(Partial Match Table),也称为最长公共前后缀表(Longest Proper Prefix which is also Sufix,简称为LPS表)。

这个过程的时间复杂度是O(m),其中m是模式串的长度。

在生成部分匹配表的过程中,KMP算法利用了前缀与后缀的性质,通过动态规划的方式计算每个位置的最长匹配长度。

虽然这个过程需要遍历整个模式串,但是每次计算的操作都具有重叠子问题的性质,因此可以通过状态转移方程高效地计算出来。

2. 匹配阶段的时间复杂度在匹配阶段,KMP算法将主串与模式串进行逐个字符的比较,并利用已经生成的部分匹配表来决定下一次比较的位置。

这个过程的时间复杂度是O(n),其中n是主串的长度。

在匹配过程中,KMP算法利用了部分匹配表的信息,根据当前位置的匹配长度来确定下一次比较的位置。

通过避免无效的比较,KMP 算法可以在最坏情况下实现线性的时间复杂度。

3. 总体时间复杂度KMP算法的总体时间复杂度是预处理阶段的时间复杂度与匹配阶段的时间复杂度之和。

即O(m) + O(n) = O(m + n)。

从总体时间复杂度可以看出,KMP算法的执行时间与主串和模式串的长度之和成正比。

相比于朴素的字符串匹配算法,KMP算法可以大大提高匹配的效率,尤其是在模式串较长的情况下。

总结:KMP算法的时间复杂度是O(m + n),其中m是模式串的长度,n是主串的长度。

通过对模式串进行预处理并利用部分匹配表的信息,KMP算法可以高效地在主串中查找所有匹配模式串的位置。

kmp算法next数组求解原理

kmp算法next数组求解原理

kmp算法next数组求解原理
KMP算法是一种字符串匹配算法,它的核心是求解next数组。

next数组是一个跳转数组,用于在匹配字符串时快速跳过已经匹配
过的部分,提高匹配效率。

求解next数组的原理是在模式串中找到最长的既是前缀又是后
缀的字符串,称之为最长公共前缀后缀(LPS),然后将模式串在该字符串后面的位置作为下一次比较的起点。

例如,对于模式串 'ABCDABD',它的next数组为
[0,0,0,0,1,2,0]。

其中,next[0]=-1,表示在第一个字符匹配失败时,模式串的下一次比较应该从文本串的下一个字符开始。

next[1]=0,表示在第二个字符匹配失败时,模式串的下一次比较应该从模式串的第一个字符开始。

next[2]=0,表示在第三个字符匹配失败时,模式
串的下一次比较应该从模式串的第一个字符开始。

next[3]=0,表示
在第四个字符匹配失败时,模式串的下一次比较应该从模式串的第一个字符开始。

next[4]=1,表示在第五个字符匹配失败时,模式串的
下一次比较应该从模式串的第二个字符开始。

next[5]=2,表示在第
六个字符匹配失败时,模式串的下一次比较应该从模式串的第三个字符开始。

next[6]=0,表示在第七个字符匹配失败时,模式串的下一
次比较应该从模式串的第一个字符开始。

通过求解next数组,KMP算法能够在时间复杂度为O(m+n)的情
况下完成字符串匹配,其中m和n分别为模式串和文本串的长度。

- 1 -。

KMP算法详解

KMP算法详解

KMP算法详解KMP 算法详解KMP 算法是⼀个⼗分⾼效的字符串查找算法,⽬的是在⼀个字符串 s 中,查询 s 是否包含⼦字符串 p,若包含,则返回 p 在 s 中起点的下标。

KMP 算法全称为 Knuth-Morris-Pratt 算法,由 Knuth 和 Pratt 在1974年构思,同年 Morris 也独⽴地设计出该算法,最终由三⼈于1977年联合发表。

举⼀个简单的例⼦,在字符串 s = ababcabababca 中查找⼦字符串 p = abababca,如果暴⼒查找,我们会遍历 s 中的每⼀个字符,若 s[i] = p[0],则向后查询p.length() 位是否都相等。

这种朴素的暴⼒的算法复杂度为O(m×n),其中m和n分别是 p 和 s 的长度。

KMP 算法可以⽅便地简化这⼀查询的时间复杂度,达到O(m+n)。

1. PMT 序列PMT 序列是 KMP 算法的核⼼,即 Partial Match Table(部分匹配表)。

举个例⼦:char a b a b a b c aindex01234567PMT00123401PMT 的值是字符串的前缀集合与后缀集合的交集中最长元素的长度。

PMT[0] = 0: 字符串 a 既没有前缀,也没有后缀;PMT[1] = 0: 字符串 ab 前缀集合为 {a},后缀集合为 {b},没有交集;PMT[2] = 1: 字符串 aba 前缀集合为 {a, ab},后缀集合为 {ba, a},交集为 {a},交集元素的最长长度为1;PMT[3] = 2: 字符串 abab 前缀集合为 {a, ab, aba},后缀集合为 {bab, ab, b},交集为 {ab},交集元素的最长长度为2;…… 以此类推。

2. 算法主体现在我们已经知道了 PMT 序列的含义,那么假设在 PMT 序列已经给定的情况下,如何加速字符串匹配算法?tar 存储 s 的下标,从 0 开始,若 tar > s.length() - 1,代表匹配失败;pos 存储 p 的下标,从 0 开始,若 s[tar] != p[pos],则 pos ⾛到下⼀个可能匹配的位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AC自动机

确定数据结构
首先,我们需要确定AC自动机所需的数据存储结构,它们的用处之后会讲 到。
AC自动机

第一步:构建Trie
构建完成后的效果
AC自动机

第二步:构建失败指针
构建失败指针是AC自动机的关键所在,可以说,若没有失败指针,所谓的AC自动机只不过是Trie 树而已。 失败指针原理: 构建失败指针,使当前字符失配时跳转到另一段从 root开始每一个字符都与当前已匹配字符段某 一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字 符串匹配失败,那么利用失配指针进行跳转。由此可知如果跳转,跳转后的串的前缀必为跳转前 的模式串的后缀,并且跳转的新位置的深度(匹配字符个数)一定小于跳之前的节点(跳转后匹 配字符数不可能大于跳转前,否则无法保证跳转后的序列的前缀与跳转前的序列的后缀匹配)。 所以可以利用BFS在Trie上进行失败指针求解。 失败指针利用: 如果当前指针在某一字符 s[m+1] 处失配,即 (p->next[s[m+1]]==NULL) ,则说明没有单词 s[1...m+1]存在,此时,如果当前指针的失配指针指向 root,则说明当前序列的任何后缀不是是 某个单词的前缀,如果指针的失配指针不指向root,则说明当前序列s[i...m]是某一单词的前缀, 于是跳转到当前指针的失配指针,以s[i...m]为前缀继续匹配s[m+1]。 对于已经得到的序列s[1...m],由于s[i...m]可能是某单词的后缀,s[1...j]可能是某单词的前 缀,所以 s[1...m] 中可能会出现单词,但是当前指针的位置是确定的,不能移动,我们就需要 temp临时指针,令temp=当前指针,然后依次测试s[1...m],s[i...m]是否是单词。 >>>简单来说,失败指针的作用就是将主串某一位之前的所有可以与模式串匹配的单词快速在 Trie 树中找出。
在蓝色字符处失配,按照暴力算法,我们应该将p串右移一位,从p串的第一个字符 开始重新与s串比较,但是我们可以发现,我们并不需要这样比较。 我们可以发现,事实上,p串的绿色与红色部分和红色与橙色部分是相同的,也就是 说,对于绿色与红色部分的任意一段字符,它在主串中下一次出现的位置必然是是 红色与橙色部分中与之对应的那段字符的位置。 比如说"abcddda"在主串中下一次出现的位置必然是"abcddda" 同理"abcdddabcddda"下一次出现的位置必然是"abcdddabcddda"
NEXT数组

如何求解NEXT数组?
现在我们面临着一个实际的问题:如何求一段字符串的NEXT数组值。 其实很简单 对于字符串 agctagcagctagctg 来说
我们指定两个指针i,j。i指定当前求解的next值的位置,j为以i位置前一个字符为尾的子字符串 中的next值,换句话说就是以i位置前一个字符为尾的子字符串中头与尾匹配的头部所能到达的最 大位置。最开始时i=1,j=0。 现在开始讨论几种情况: 当j==-1时,代表已经找不到长度大于1的字符串循环了,此时就可以将i位置的next值设为0,然 后i++,j++,如果存在长度等于1的字符串循环的话,在下一次判断时i+1的值就会为1(这是正确的, 因为关于i的next值是i之前(不包括i)的子字符串的最大循环长度) 当t[i]==t[j]时,说明延续了前一个子字符串的对称性,i++,j++,并将next[i]=j,这样子就可以 将当前位置为尾(i)的next值赋值进下一个位置(i+1),并且下一次判断也就从(i+1)这个位置开始 了。 当t[i]!=t[j]且j!=-1时,说明不可能延续前一个子字符串的对称性,也不一定不存在更小的字符 串循环,此时将j=next[j],它的意思就是在当前的对称中继续寻找子对称(因为如果t[i]是某个 更小的字符串循环的最后一个字符,那么为了保证它前方字符同样存在对称性,以t[i]为尾的更 小的字符串循环必然在当前已经存在的t[i-1],t[i-2]....t[i-next[j]]中存在,因为若是子循环 的尾部存在t[i],t[i-1],t[i-2]....t[i-next[j]],那么它也会随着子循环被传递到t[i]这个位置。
NEXT数组

关于NEXT数组
有了上面的铺垫,我们就可以知道next数组的作用了,它的作用就是记录 字符串每一个位置之前的子字符串中头部与尾部相同的字符段的最大长度, 换句话说,就是记录到当前位置(不包括当前字符)之前的那一段子字符 串头与尾中相同的字符段的最长长度。 如字符串 agctagcagctagctg 的next数组值就为 -1 0 0 0 0 1 2 3 1 2 3 4 5 6 3 4
代码:
KMP算法

概述
KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth 与 V.R.Pratt 和 J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作 (简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模 式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个 next()函数,函数本身包含了模式串的局部匹配信息。
AC自动机

第二步:构建失配指针
观察构造失败指针的流程:对照图来看,首先root的fail指针指向NULL,然后root入队,进入循 环。从队列中弹出root,root节点与s,h节点相连,因为它们是第一层的字符,肯定没有比它层数 更小的共同前后缀,所以把这2个节点的失败指针指向root,并且先后进入队列,失败指针的指向 对应图中的(1),(2)两条虚线;从队列中先弹出h(右边那个),h所连的只有e结点,所以接下来扫 描指针指向e节点的父节点h节点的fail指针指向的节点,也就是root,root->next['e']==NULL, 并且root->fail==NULL,说明匹配序列为空,则把节点e的fail指针指向root,对应图中的(3),然后 节点e进入队列;从队列中弹出s,s节点与a,h(左边那个)相连,先遍历到a节点,扫描指针指向a 节点的父节点s 节点的 fail指针指向的节点,也就是 root ,root->next['a']==NULL, 并且root>fail==NULL,说明匹配序列为空,则把节点a的fail指针指向root,对应图中的(4),然后节点a进入 队列。接着遍历到h节点,扫描指针指向h节点的父节点s节点的fail指针指向的节点,也就是root, root->next['h']!=NULL,所以把节点h的fail指针指向右边那个h,对应图中的(5),然后节点h进入 队列...由此类推,最终失配指针如下图所示。
字符串匹配的暴力算法

暴力算法的实现
设i指针为主串s第i位置的字符,j指针为模式串p第j位置的字符,最开始 i与j均从0开始,当s[i]==p[j]时,i++,j++,主串与模式串开始比较下一 位。当s[i]!=p[j] 时,j设为0,i设为上一次s[i]==p[j]时i的值加1,即 将模式串往后滑动一位,并且模式串与主串的匹配再次从模式串的第 0个 字符开始,若搜索到模式串即记录下来,若未搜索到模式串,将会在i指针 到达主串s末尾时结束程序。 很显然时间复杂度为O(nm)
AC自动机

关于AC自动机
AC自动机:Aho-Corasick automation ,该算法在1975年产生于贝尔实验 室,是著名的多模匹配算法之一。一个常见的例子就是给出 n个单词,再 给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。 要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基 础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式 匹配过程。 简单来说,AC自动机是用来进行多模式匹配(单个主串,多个模式串)的 高效算法。
Trie树

Trie树的结构
Trie树的入口称为root,root点不保存除引出字符外的任何信息。 其他节点保存的信息有: count:到此节点处截止的单词个数,如没有单词以该节点结尾,则count 值为-1 next[26]:记录下面的节点(26对应a-z,若大小写混合,next数组开到52 即可)
KMP算法

如何让模式匹配加速
s串:abcdddabcdddabcdddabcdddabcdddaa p串:abcdddabcdddabcdddaa 求p串在s串中第一次出现的位置 第一次匹配:
s : a b c d d d a b c d d d a b c d d d a b c d d d a b c d d d a a p:abcdddabcdddabcdddaa
所以我们在进行下一次匹配的时候直接将 "abcdddabcdddab"中的"b"与失配的那个 "b"继续对比即可,不再需要做无谓的重复计算,而如果失配的位置不在模式串尾部, 我们也可以通过当前位置之前字符串的头与尾的相同字符段位置计算出下一次比较 的位置。
而如何记录到每一个位置时之前相同的字符段的位置,或是说最大长度(因为必然
KMP算法 & AC自动机
By Cajon Pass
字符串匹配

字符串匹配中的几个概念
模式串:等待被在主串中匹配的串 主串:被模式串匹配的串 字符串匹配:在主串中查找模式串的过程
• 比如对于主串: aabbcc 与模式串:aa 来说,一般所 要进行的匹配是在主串中查找模式串第一次出现的 位置,比如模式串:aa 在主串:aabbcc 中第一次 出现的位置是1。
Trie树
相关文档
最新文档