KMP字符串模式匹配学习笔记
KMP算法实验
1.编程计算模式串(子串)的next值。
2.利用KMP算法在主串中找到模式串的位置。
参考代码:
---------
int getNexlVal( char * s, int j)//求字符串S的j的模式值
{
if( j == 1) return 0;//j=1,next[j]=0
int max = 0;//其他情况,next[j]=max+1=1
for( int l = 1; l < j-1 ; l ++ )//从K前面第l个数开始找
{
for( int k = 1; k <=l; k ++)//k代表从字符串开始的l的前面的数遍历
{
if( s[k] != s[j-l+k-1] ) break;//字符串从头开始的第k个值与第j个数前的第l个值不相等,跳出
}
if(k == (l+1))//j前有l个数和从头开始的l个数相同,第l+1=k个数不同
{
if(max <l) max = l;//max=l
}
//模式串s中下标为j的字符,如果j的前面k个
//字符与开头的k个字符相等,且T[j] != T[k]
}
return max+1;//next[j]=max+1=l+1=k
}
void getNext( char * s, int * val)
{
printf("VAL%s:",s);
for( int i = 1; i< strlen(s); i ++ )
{
val[i] = getNexlVal( s, i);
printf("%d ",val[i]);
}
printf("\n");
return;
}
int KMP( char * r, char *s , int * v)
{
int i = 1;
int j = 1;
while( i<strlen(r) && j<strlen(s))
{
if( j==0 || r[i] == s[j] ){ i++; j++; }//继续比较后续字符
else j = v[j];//模式串向右移动
}
if( j == strlen(s)) { printf("FOUND @ %d \n", i-j+1); return i-j;}//匹配成功
else return 0;
}
int main(int argc, char* argv[])
{
char s[10];
char r[100];
int next2[10];
printf("子串:\n");
scanf("%s",s);
printf("主串:\n");
scanf("%s",r);
getNext(s,next2);
KMP( r,s,next2);
return 0;
}
KMP字符串模式匹配学习笔记的更多相关文章
- 【KMP】【字符串】KMP字符串匹配算法 学习笔记
一.简介 KMP是由Knuth.Morris和Prat发明的字符串匹配算法,它的时间复杂度是均摊\(O(n+m)\).其实用Hash也可以做到线性,只不过Hash存在极其微小的难以避免的冲突. ...
- KMP字符串模式匹配详解(zz)
刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN A_B_ ...
- KMP字符串模式匹配详解(转)
来自CSDN A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...
- BM和KMP字符串匹配算法学习
BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...
- KMP字符串模式匹配详解
KMP字符串模式匹配详解 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- KMP模式匹配 学习笔记
功能 能在线性时间内判断字符串\(A[1~N]\)是否为字符串\(B[1~M]\)的子串,并求出字符串\(A\)在字符串\(B\)中各次出现的位置. 实现 1.对字符串\(A\)进行自我"匹 ...
- OI字符串 简单学习笔记
持续更新qwq KMP 其实是MP啦qwq 就是先自己匹配自己得到状态图,然后再在上面进行模式串的匹配. nxt数组返回的是以该节点结尾的,最长的,在前面出现过的,不相交的,字符串的最靠右的,末位位置 ...
- Python字符串(Python学习笔记02)
字符串 Python 3 中的字符串可以使用双引号或单引号标示,如果字符串出现引号,则可以使用 \ 来去除引号标示字符串的作用. 几种字符串的表示方法: str1 = "hello" ...
随机推荐
- 添加Sql作业,新建步骤出现:从IClassFactory为CLSID为{AA40D1D6-CAEF-4A56-B9BB-D0D3DC976BA2}的COM组件创建实例失败,原因是出现以下错误:c001f011。的解决方法
32位操作系统: 打开运行(命令提示符), 一.输入 cd c:\windows\system32 进入到c:\windows\system32路径中 二.输入 regsvr32 "C:\P ...
- Java面向对象的三大特征
Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...
- Android布局— — —表格布局
表格布局 以表格的形式来显示界面中的控件,表格的每一行为一个TableRow,每当一个控件添加到TableRow中,就生成一个单元格. 语法格式: <TableLayout xmlns:andr ...
- poj1160 dp
//Accepted 564 KB 63 ms //和hdu1227一样 //dp[i][j]=min(dp[i][j],dp[k][j-1]+cost[k+1][i]) //初始化条件,dp[0][ ...
- SQL中让某一字段更新时自动加1
update 表 set 字段名=字段名+1 where ....
- 如何用JS获取ASP.net中的textbox的值 js获不到text值
<tr> <td class="table_body" style="width: 10%" a ...
- 关于linux python vim的一些基础知识(很零散)
清空文件夹filenmae下所有文件 rm filename/* vim复制大量代码段 num+yy 从光标起始处复制num个数行 然后 python: 设置中断 1.from IPython imp ...
- [DP]数位DP总结
数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step http://blog.csdn.net/dslovemz/article/details/ ...
- magento缓存系列详解:clean cache
cache是一个很大的概念,涉及的内容方方面面,magento cache是基于zend的,如果你对zend cache理解很深的话,相信magento cache也不再话下,本篇文章着重介绍Flus ...
- 解决两台虚拟机互ping可通,但connect失败
问题描述: 在UNP一书中实例中,采用两台不同的虚拟机.即一台虚拟机作为服务端,另外一台虚拟机作为客户端. 现象: 两台电脑各自互ping可通 客户端访问local可行 客户机访问服务端报错:No r ...