KMP算法(C++)

KMP算法与BF算法不一样的在于,当主串与子串不匹配时,主串不回溯,选择了子串回溯,大大提高了运算效率。

借用了next1【】数组,让子串回溯。get_next函数求next1【】数组,get_next函数的实现难点在于下列几行代码:

while (i < T.length)

{

if (j == 0 || T.ch[i] == T.ch[j])

{

++i, ++j;

next1[i] = j;

}

else

j = next1[j];

}

只要明确两点就容易理解:

1、T j == Tnext[j],那么next[j+1]的最大值为next[j]+1。

2、T j != Tnext[j],那么next[j+1]可能的次最大值为next[ next[j] ]+1,以此类推即可求出next[j+1]。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
int next1[1000];
typedef struct node
{
	char ch[251];
	int length=0;//串当前长度
}SString;
void get_next(SString T)
{
	int i = 1;//当前串正在匹配字符串位置,也是next数组的索引
	next1[1] = 0;
	int j = 0;
	while (i < T.length)
	{
		if (j == 0 || T.ch[i] == T.ch[j])
		{
			++i;
			++j;
			next1[i] = j;
		}
		else
			j = next1[j];
	}
}
int Index_KMP(SString S, SString T, int pos)//S主串,T子串,pos从主串pos位置开始匹配
{
	int i = pos, j = 1;//i为主串下标,j为子串下标
	while (i <= S.length && j <= T.length)
	{
		if (S.ch[i] == T.ch[j])//匹配,往下继续
		{
			i++;
			j++;
		}
		else
			j=next1[j];
	}
		if (j >= T.length) return i - T.length;//返回主串与子串匹配时,主串的第一个下标
		else return 0;
}
int main()
{
	SString  s;
	SString  t;
	cout << "输入主串长度:" ;
	cin >> s.length;
	cout << endl;
	cout << "输入子串长度:";
	cin >> t.length;
	cout << endl << "输入主串:";
	for (int i = 1; i <= s.length; i++)//从下标1开始储存
	{
		cin >> s.ch[i];
	}
	cout << endl << "输入子串:";
	for (int i = 1; i <= t.length; i++)
	{
		cin >> t.ch[i];
	}
	get_next(t);
	int a = Index_KMP(s, t, 1);
	cout <<endl<< a;
}
相关推荐
CoovallyAIHub9 分钟前
何必先OCR再LLM?视觉语言模型直接读图,让百页长文档信息不丢失
深度学习·算法·计算机视觉
CoovallyAIHub25 分钟前
NAN-DETR:集中式噪声机制如何让检测更“团结”?
深度学习·算法·计算机视觉
CoovallyAIHub30 分钟前
火箭工程大学多模态遥感检测新框架MROD-YOLO:如何将小目标检测精度提升至77.9%?
深度学习·算法·计算机视觉
steins_甲乙30 分钟前
C++并发编程
开发语言·c++
CoovallyAIHub35 分钟前
未来物体检测趋势:需要关注的 7 个关键问题
深度学习·算法·计算机视觉
业精于勤的牙38 分钟前
小张刷题计划(二)
数据结构·算法
谈笑也风生39 分钟前
期望个数统计(二)
算法
hans汉斯40 分钟前
【人工智能与机器人研究】人工智能算法伦理风险的适应性治理研究——基于浙江实践与欧美经验的整合框架
大数据·人工智能·算法·机器人·数据安全·算法伦理·制度保障
CoderYanger1 小时前
动态规划算法-两个数组的dp(含字符串数组):42.不相交的线
java·算法·leetcode·动态规划·1024程序员节
南莺莺2 小时前
二叉排序树的创建和基本操作---C++实现
数据结构·c++·算法··二叉排序树