博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP字符串模式匹配学习笔记
阅读量:4546 次
发布时间:2019-06-08

本文共 1190 字,大约阅读时间需要 3 分钟。

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;

}

转载于:https://www.cnblogs.com/MiLu/p/3482565.html

你可能感兴趣的文章
utf-8与unicode
查看>>
【转】UML类图关系全面剖析
查看>>
QT 窗口置顶功能
查看>>
jenkins报错jdk1.8/jre/lib/amd64/libawt_xawt.so
查看>>
Tomcat8 结构原理解析
查看>>
CodeVS 1697-⑨要写信
查看>>
关于#pragma once和#ifndefine组合的区别
查看>>
System.Json 使用注意
查看>>
python对日志处理的封装
查看>>
插件的使用(4)-fileupload
查看>>
libuv源码分析(2)
查看>>
【bzoj4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配
查看>>
oracle Rman 备份脚本
查看>>
网页二维码制作
查看>>
Python-元编程
查看>>
普通table表格样式及代码大全(全)
查看>>
php安装composer
查看>>
C# 使用默认浏览器打开链接
查看>>
【M13】以by reference 方式捕捉exceptions
查看>>
[HTML5] Blob对象
查看>>