赞
踩
(考研真题待更新)
欢迎订阅专栏:408直通车
请注意,本文中的部分内容来自网络搜集和个人实践,如有任何错误,请随时向我们提出批评和指正。本文仅供学习和交流使用,不涉及任何商业目的。如果因本文内容引发版权或侵权问题,请通过私信告知我们,我们将立即予以删除。
串的概念
子串的概念
char 8bit 0~255
概念
算法思想
缺点
基本概念
前缀
后缀
算法思想
表明当模式中第j个字符与主串中相应字符匹配失败时,在模式中需重新和主串中该字符进行比较的字符位置
计算
以“abab”为例
序号j = 1时,属于j == 1情况,next[j] = 0
序号j = 2时,‘a’的前后缀都为空集,属于其他情况,next[j] = 1
序号j = 3时,‘ab’的前缀为{a},后缀为{b},交集为空,属于其他情况,next[j] = 1
序号j = 4时,‘aba’的前缀为{a,ab},后缀为{a,ba},交集为{a},k - 1 = 1(长度),next[j] = k = 2(长度+1)
时间复杂度:O(m + n)
1
2
3
4
5
6
若模式串指向的位置的字符等于本身,可以直接赋值
举例
5号的a中next数组指向3号位置,3号位置也是a故直接把3号的next数组值复制过去
6号的a中next数组指向4号位置,两者字符不同,不能优化
cin >> n >> p+1 >> m >> s+1;// char数组s是长文本,p是模式串,且从数组下标1开始存储
for(int i=2,j=0;i<=n;i++){ //求next数组
while(j&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<=m;i++){ //匹配
while(j&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==n){
j=ne[j];
//匹配成功
}
}
(考研真题待更新)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。