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字符串模式匹配学习笔记的更多相关文章

  1. 【KMP】【字符串】KMP字符串匹配算法 学习笔记

    一.简介     KMP是由Knuth.Morris和Prat发明的字符串匹配算法,它的时间复杂度是均摊\(O(n+m)\).其实用Hash也可以做到线性,只不过Hash存在极其微小的难以避免的冲突. ...

  2. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  3. KMP字符串模式匹配详解(转)

    来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...

  4. BM和KMP字符串匹配算法学习

    BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...

  5. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

  6. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  7. KMP模式匹配 学习笔记

    功能 能在线性时间内判断字符串\(A[1~N]\)是否为字符串\(B[1~M]\)的子串,并求出字符串\(A\)在字符串\(B\)中各次出现的位置. 实现 1.对字符串\(A\)进行自我"匹 ...

  8. OI字符串 简单学习笔记

    持续更新qwq KMP 其实是MP啦qwq 就是先自己匹配自己得到状态图,然后再在上面进行模式串的匹配. nxt数组返回的是以该节点结尾的,最长的,在前面出现过的,不相交的,字符串的最靠右的,末位位置 ...

  9. Python字符串(Python学习笔记02)

    字符串 Python 3 中的字符串可以使用双引号或单引号标示,如果字符串出现引号,则可以使用 \ 来去除引号标示字符串的作用. 几种字符串的表示方法: str1 = "hello" ...

随机推荐

  1. iOS线程

    昨天在项目中使用到了以前所没有使用过的线程,今天有时间来简单的学习一下. 一.线程的创建分为三种方法 (id)init; // designated initializer (id)initWithT ...

  2. (spring-第7回【IoC基础篇】)BeanDefinition的载入与解析&&spring.schemas、spring.handlers的使用

    报错信息:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http: ...

  3. 使用respondsToSelector:来发现对象是否响应消息

    发现对象是否响应消息 要发现一个对象是否响应一则消息,请在该对象上调用 respondsToSelector: 方法.应用程序代码通常验证一个对象响应一则消息后,才将消息发送给该对象. if ([it ...

  4. PHP中的文件下载

    文件下载:用<a href="链接"></a>这种是下载,但对于浏览器能解释的文件类型此下载非彼下载.向服务器请求的时候:1.协议和版本2.头信息3.请求的 ...

  5. Python - 学习经验分享

    执行方式: 直接输入python进入命令行,进行单行输入执行,退出后不保存. python filename.py或./filename.py 直接执行脚本文件 脚本格式: #!/usr/bin/py ...

  6. session 和 cookie 的区别和联系

    二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没 ...

  7. HDU 4462

    http://acm.hdu.edu.cn/showproblem.php?pid=4462 一道题意不清的水题 题意:给一个n*n的格子,在上面放草人,每个草人有恐惧范围,问最少选择几个草人可以覆盖 ...

  8. vs2012后设置显示行号结果整个窗口都变成黑色了,怎么变回来

  9. 重学STM32---(七) FSMC+LCD

    关于FSMC+LCD第一次学习完时候,自己也还是对这个不清不白,时而清楚,时而糊涂.这一次再次学习的话,不能在这样了,仔仔细细把STM32参考手册,原子的LCD实验看了一遍,又在网上找了好些关于FSM ...

  10. 《JavaScript模式》第2章 基本技巧

    @by Ruth92(转载请注明出处) 第2章 基本技巧 一.编写可维护的代码 阅读性好 具有一致性 预见性好 看起来如同一个人编写 有文档 编写注释 编写 API 文档 @namespace:用于命 ...