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;
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值