用于处理像:
主串:aaaaaaabcdefh
子串:aaaaaaaax
头文件:KmpAlgorithm.h
#ifndef KMPALGORITHM_H
#define KMPALGORITHM_H
void Get_Next(char *T,int *next); //求模式串T的next函数
int Index_Kmp(char *s,char *t,int pos); //Kmp字符串匹配函数
#endif //KMPALGORITHM_H
实现文件:KmpAlgorithm.cpp
#include "KmpAlgorithm.h"
#include <string.h>
void Get_Next(char *T,int *next)
{
int i = 0;
int j = -1;
next[0] = -1;
while(T[i] != '\0')
{
if(j == -1 || T[j] == T[i]) //T[j]为前缀的单个字符,T[i]为后缀的单个字符
{ //T[-1]不存在所以在回溯到j == -1时直接++j
++j;
++i;
if(T[j] != T[i]) //当前字符串与前缀字符不同
next[i] = j; //j为next在i位置的值
else
next[i] = next[j]; // 相同则将前缀字符的next值赋给next在i位置的值
}
else
j = next[j]; //如果不相等则回溯
}
}
int Index_Kmp(char *s,char *t,int pos) //Kmp字符串匹配函数
{ //pos不为1,则从主串s的第pos个字符开始与t串匹配
int i = pos - 1; //数组的下标从零开始
int j = 0;
int next[255];
Get_Next(t,next);
while(s[i] != '\0' && t[j] != '\0') //如果字符串未结束则继续循环
{
if(s[i] == t[j])
{
++i;
++j;
}
else
{
j = next[j]; //不相等则回溯
if(j == -1)
{
++j;
++i;
}
}
}
if(t[j] == '\0')
return i - strlen(t) + 1;
else
return -1;
}
测试文件:main.cpp
#include "KmpAlgorithm.h"
#include <stdio.h>
#include <string.h>
int main()
{
char s[255];
char t[255];
int pos = 0,position = 0;
memset(s,0,sizeof(char)*255);
memset(t,0,sizeof(char)*255);
printf("请输入要进行匹配的主串:\n");
scanf("%s",s);
printf("请输入要进行匹配的子串:\n");
scanf("%s",t);
printf("请输入要从主串中开始匹配的位置:\n");
scanf("%d",&pos);
position = Index_Kmp(s,t,pos);
if(position == -1)
printf("子串未在主串的%d个位置之后出现\n",pos);
else
printf("子串在主串的第%d个位置出现:\n",position);
return 0;
}