首页 > 技术文章 > 【字符串处理】关于KMP算法输出的是什么&代码

dudujerry 2018-09-15 22:12 原文

输入:

ABCDABTBD_TISABCDABC
ABCDABC

 

q为当前nxt处理的模版文本串下标;

k为“失配时去哪里”,详情请看注释。

--------------我是求完nxt的分界线------------------

q为当前文本串判断到哪里;

nxt为“失配时去哪里”。

 

 

输出:
nxt[q(1)]=k(0);
nxt[q(2)]=k(0);
nxt[q(3)]=k(0);
k(0)++;
nxt[q(4)]=k(1);
k(1)++;
nxt[q(5)]=k(2);
k(2)++;
nxt[q(6)]=k(3);
next数组求解完毕
q(0)++;
q(1)++;
q(2)++;
q(3)++;
q(4)++;
q(5)++;
q=nxt[q-1](0);
q=nxt[q-1](0);
q(0)++;
q(1)++;
q(2)++;
q(3)++;
q(4)++;
q(5)++;
q(6)++;
return i(19)-lp(7)+1;
pos=13

 

 

-------------------我是代码分界线------------------------

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 string T,P;
 5 int nxt[1000002];
 6 void mkNxt(){
 7     nxt[0]=0;
 8     int k,q;
 9     for(k=0,q=1;q<P.length();q++){//遍历模版串以求出next数组
10         while(k>0&&P[k]!=P[q]){
11             k=nxt[k-1];//如果遇到“已经匹配过超过一个字符”又不匹配的地方,返回上一次求出的next,找到第二个已经匹配的地方
12         }
13         if(P[k]==P[q]){//如果成功就k++
14             k++;//换句话说,k代表着当前能够匹配的最大长度
15         }
16         nxt[q]=k;//记录
17     }
18     
19 }
20 void KMP(){
21     int q=0;
22     for(int i=0;i<T.length();i++){//文本T和模版P匹配
23         while(q>0&&P[q]!=T[i]){//如果不匹配就拿出“最长前后缀表”
24             q=nxt[q-1];
25         }
26         if(P[q]==T[i]){//匹配一个就加大长度
27             q++;
28         }
29         if(q==P.length()){
30             cout<<i-q+2<<endl;//完全匹配就输出
31         }
32     }
33 }
34 int main(){
35     cin>>T>>P;
36     mkNxt();
37     KMP();
38     for(int i=0;i<P.length();i++){
39         cout<<nxt[i]<<" ";
40     }
41 }
显示神奇代码

 

  这份代码在洛谷上提交通过了。

  地址是 https://www.luogu.org/problemnew/show/P3375

推荐阅读