【数据结构学习笔记】4.2串的匹配模式
1.朴素模式匹配算法
-
字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。
主串:‘abaabbbammnaaannnjaa’
模式串:'aabb'
[key]:子串是主串的一部分,一定存在;模式串,不一定能在主串中找到。
-
主串长度为n,模式串长度为m
朴素模式匹配算法:将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串或所有的子串都不匹配为止。(暴力)--->Index(S,T)
int Index(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
++i;++j; //继续比较后继字符
}
else{
i=i-j+2;
j=1; //指针后退重新开始匹配
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
最坏时间复杂度=O(nm)
最坏的情况,每个子串都要对比m个字符,共n-m+1个子串,复杂度=O((n-m+1)m)=O(nm),因为很多时候n>>m
2.KMP算法
-
基本算法示意图
模式串指针始终指向下一个需要比较的元素。
-
优化特性:主串指针不"回溯"
-
原理:
- 根据模式串T,求出next数组
- 利用next数组进行匹配(主串指针不回溯)
-
最坏时间复杂度=O(n+m)
-
next数组时间复杂度O(m)
-
模式匹配过程最坏时间复杂度为O(n)
3.求模式串的next数组(手算练习)