KMP算法代码
以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码的思路是相对很清晰的。以后的KMP算法求解建议依照此版本进行代码构思。再次强调下本版本的next数组:
例如:
// T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
该版本的next数组的一个好处在于:字符串的下标是从零开始的,符合C++下string本身的特点;且另next[0]=-1,取值非常巧妙。
//新的KMP算法思路
int myNewKMP(const string& P,const string& T,const int* next)
{
int P_length = P.size(),T_length = T.size();
int i=,q=;//i----主串下标;q---子串下标号 while (i<P_length && q<T_length)
{
if(q==- || P[i]==T[q])
{
++i;
++q;
}
else{
q=next[q];
}
}
if(q==T_length)
return (i-T_length);
else
return -;
} //新的求next数组的思路
//next 数组举例示范:
// T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
void myNewNext(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
next[q]=k;
}
else
k = next[k];
}
}
//优化后的
void myNewNextUpdate(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
//注意:注意这里是++i和++j之后的p[i]、p[j]
//修改:因为如果T[q]==T[k],则假如主串中某个字符与T[q]没有匹配上时,则把该字符与T[k]匹配将仍然是匹配不上的。
if(T[q]!=T[k])
next[q]=k;
else
next[q]=next[k];
}
else
k = next[k];
}
}
int main()
{
int i;
int shift = -;
int next[]={};
string P= "ababxbaaaabaaacfdsss";
string T = "aaabaaac";
cout<<"P="<<P<<endl;
cout<<"T="<<T<<endl; myNewNext(T,next);
if((shift = myNewKMP(P,T,next)) !=-)
cout<<"shift is "<<shift<<endl;
for (i = ; i< T.size(); ++i)
{
printf("%d ",next[i]);
}
printf("\n"); return ;
}
KMP算法代码的更多相关文章
- 【原创】KMP算法代码(C)
//s是模式字符串,t是匹配字符串(可以看我上一篇文章中的叙述) int KMP(const char * s , const char * t) { int slen = strlen(s) , t ...
- Java KMP算法代码
1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...
- 【编程练习】kmp算法代码
代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...
- KMP算法以及优化(代码分析以及求解next数组和nextval数组)
KMP算法以及优化(代码分析以及求解next数组和nextval数组) 来了,数据结构及算法的内容来了,这才是我们的专攻,前面写的都是开胃小菜,本篇文章,侧重考研408方向,所以保证了你只要看懂了,题 ...
- kmp算法简明教程
在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a ...
- 查找子字符串----KMP算法深入剖析
假设主串:a b a b c a b c a c b a b 子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...
- 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
- kmp算法模板及理解
kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...
随机推荐
- 禁止Linux用户登录方法
我们在做系统维护的时候,希望个别用户或者所有用户不能登录系统,保证系统在维护期间正常运行.这个时候我们就要禁止用户登录. 1.禁止个别用户登录.比如禁止lynn用户登录. passwd -l lynn ...
- UVALive 4953 Wormly--【提醒自己看题要仔细】
有一条虫要过桥,桥有断的木板和好的木板.虫有L条腿B个身体,桥长N.01串表示桥的好坏.输出最少操作次数. 一开始虫的身体在最左B桥上,腿在最左L桥上,最后要到达最右B以及最右L... 操作有2种:① ...
- 【leetcode】Number of Islands(middle)
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- 【python】判断字符串日期是否有效
来源: http://www.jb51.net/article/66014.htm http://www.runoob.com/python/att-time-strptime.html 用time模 ...
- POJ 3185 The Water Bowls (高斯消元)
题目链接 题意:翻译过来就是20个0或1的开关,每次可以改变相邻三个的状态,问最小改变多少次使得所有开关都置为0,题目保证此题有解. 题解:因为一定有解,所以我们可以正序逆序遍历两次求出较小值即可.当 ...
- CSS命名格式
CSS样式命名整理页面结构 容器: container/wrap整体宽度:wrapper页头:header内容:content页面主体:main页尾:footer导航:nav侧栏:sidebar栏目: ...
- osgconv 批量转换
@echo offfor /f "delims=" %%i in ('dir/b *.osg') do ( "osgconv.exe" "%%~ni. ...
- apache ab下载测试
http://httpd.apache.org/docs/2.0/programs/ab.html-->http://httpd.apache.org/docs/current/platform ...
- 奶牛健美操(codevs 3279)
题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点 ...
- 借助LinkedHashMap实现基于LRU算法缓存
一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...