首页 > 代码库 > Chapter 4. 字符串 KMP算法

Chapter 4. 字符串 KMP算法

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算法