码迷,mamicode.com
首页 > 编程语言 > 详细

Chapter 4. 字符串 KMP算法

时间:2017-05-21 20:39:40      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:csdn   wan   name   了解   efi   bsp   aot   return   zhang   

Chapter 4. 字符串 KMP算法

Sylvia‘s I.

      讲的比较好的博客1博客2

      表问窝,在窝翻遍全网的博客后,窝已经处于混乱状态……

Sylvia‘s II.

            窝是贴代码的小能手……

//前方高能请注意
//窝并不知道窝在说什么……
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; #define debug(x) cerr<<#x<<‘=‘<<x<<endl #define MAXN1 1000006 #define MAXN2 1003 int Next[MAXN2];//next是c++11的保留字…… char target[MAXN1],pattern[MAXN2];//target主串(目标串),pattern模式串 int lenp,lent;//各字符串长度 void GetNext(char p[],int lenp){//计算Next跳转数组 int i,j=0;//j指向的是已经匹配的前缀 Next[0]=0;//初始化 Next[1]=0;//初始化…… for (int i=1;i<lenp;i++){ while (j&&p[i]!=p[j]) j=Next[j];//跟下面的函数怎么那么类似啊 if (p[i]==p[j]) j++; Next[i+1]=j; //得到这一位的前缀后缀最长公共长度, //放入下一位的Next数组 //为什么是下一位?嗯,先去了解一下Next数组吧 } } void kmp (char t[],int lent,char p[],int lenp){//进行匹配 int i,j=0;//i指向的是target,j指向的是pattern for (int i=0;i<lent;i++){ while (j&&t[i]!=p[j]) j=Next[j];//失配,跳转 if (t[i]==p[j]) j++;//某一字符匹配成功那么向后指一位 if (j==lenp){//如果完全匹配成功 printf("%d\n",i-lenp+2);//输出位置1,2,3,4…… j=Next[j];//继续匹配 } } } int main () { scanf("%s",target); scanf("%s",pattern); lenp=strlen(pattern); lent=strlen(target); GetNext(pattern,lenp); kmp(target,lent,pattern,lenp); for (int i=1;i<=lenp;i++) printf("%d ",Next[i]);//输出数组Next,窝就是咸的…… return 0; }

 

 

 


 

 

嫌疑人x献身

东野圭吾

“你我都不可能摆脱时钟的束缚,彼此都已沦为社会这个时钟的齿轮。

一旦少了齿轮,时钟就会出乱子。

纵然自己渴望率性而为,周遭也不容许我们这样做。

这虽然同时也让我们得到了安定,但失去自由也是不争的事实。”

 


 

Sylvia

二零一七年五月二十一日

Chapter 4. 字符串 KMP算法

标签:csdn   wan   name   了解   efi   bsp   aot   return   zhang   

原文地址:http://www.cnblogs.com/jasmine-lee/p/6884962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!