一直有个情结,那就是对数据结构恐惧感,也许跟大学读书方式有关,其实这跟小时候的挫折感一样,“怕蛇效应"
走过那个那山头,另有一片天空。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int* GetNext(char* s)//求模式串的next数组,用next指向它;
{
int i,j;
i=0;
j=-1;
int slen=strlen(s);//字符串长度
int *next=(int*)malloc(sizeof(int)*slen);
next[0]=-1;
cout<<"next[0]="<<next[0]<<". i="<<i<<". j="<<j<<".";
while(i<slen-1)
{
if(-1==j||s[i]==s[j])
{
i++;j++;next[i]=j;
cout<<endl;
cout<<"next["<<i<<"]"<<"="<<next[i]<<".
i="<<i<<". j="<<j<<" ";
}
else
{
j=next[j];
cout<<j<<" ";
}
}
return (next);
}
举例:abababb
的next[i]
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
模式串 | a | b | a | b | a | b | b |
next[i] | -1 | 0 | 0 | 1 | 2 | 3
原书为1 | 4
原书为2 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
-1 | 0 | 0 | 1 | 2 | 3 | 4 |
大名鼎鼎的《软件设计教程》竞然错误,为表格上所示。
int KMP(char *s,char *p,int pos)//s为主串,p为模式串
{
int *next=GetNext(p);
int i=pos-1;
int j=-1;
int slen=strlen(s);
int plen=strlen(p);
while(i<slen&&j<plen)
{
if(-1==j||s[i]==p[j])
{
i++;j++;
}
else
{
j=next[j];
}
}
if(j>=plen)
{
return i-plen;
}
else
return -1;
}
int main()
{
char* s="abababb";//模式串
char* ms="abacbcabababbcbc";
int i=0;
i=KMP(ms,s,0);
cout<<endl<<"这个位置为"<<i<<"。";
getchar();
return 0;
}