Kmp字符串匹配算法改进版

用于处理像:

主串: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;
}

 

 

 

 

    原文作者:KMP算法
    原文地址: https://blog.csdn.net/flying0033/article/details/6950395
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞