KMP算法

#include<stdio.h>
#include<string.h>
void sstring(chara,charb)//將一個字符串整體後移一個單位方便後續計算
{
int len,i;
a[0]=strlen(b);
for(i=1;i<=a[0];i++)
a[i]=b[i-1];
return;
}
void get_next(char T,int next) //next函數求法運用了遞推的思想,即從廣義的某個字符t[i]開始推出普遍規律 其中又再次運用了kmp思想
{
int i=1,j=0;
next[1]=0;
while(i<T[0])
歐元符號http://www.gendan5.com/currency/EUR.html
if(j==0||T[i]==T[j])//j=0意味着無相同前後綴,模式串從首位開始重新與主串匹配
{
++i;
++j;
next[i]=j; //這三步可以直接寫成 next[++i]=++j;
}
else
j=next[j];//仍然不匹配 模式串右滑
}

/ void get_next(char T,int next)
{
int i=1,j=0;
next[1]=0;
while(i<T[0])
if(T[i]= =T[j])
{
++i;
++j;
next[i]=j;
}
else if(j==0) //實際上是三種情況 但第二種if完全可以合併到第一種if中
{
j=1;
i++;
next[i]=1;
}
else
j=next[j];//仍然不匹配 模式串右滑
}/

int KMP(charS,charT,int pos,int*next) //next函數是基於kmp算法實現的 只要清楚next函數的算法,kmp算法就可以搞明白
{
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
if(j==0||S[i]==T[j])
{
++i;
++j;
}
else
j=next[j];
if(j>T[0])
return i-T[0];
else
return 0;
}
int main()
{
char s1[1000],s2[1000],t[1000],p[1000];
int i,next[1000];
printf(“請輸入主串\n”);
gets(s1);
printf(“請輸入模式串\n”);
gets(s2);
sstring(t,s1);
sstring(p,s2);
get_next(p,next);
i=KMP(t,p,1,next);
if(i)
printf(“主串和子串在第%d個字符處首次匹配\n”,i);
else
printf(“主串和子串匹配不成功\n”);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章