【编程练习】kmp算法代码

 

 代码来自:

 

http://blog.csdn.net/v_JULY_v

 

#include "StdAfx.h"
#include <iostream>

using namespace std;

void GetNextval(char* p, int* next)
{
	int pLen = strlen(p);
	next[0] = -1;
	int k = -1;
	int j = 0;
	while (j < pLen - 1)
	{
		//p[k]表示前缀,p[j]表示后缀  
		if (k == -1 || p[j] == p[k])
		{
			++j;
			++k;
			//较之前next数组求法,改动在下面4行
			if (p[j] != p[k])
				next[j] = k;   //之前只有这一行
			else
				//因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]
				next[j] = next[k];
		}
		else
		{
			k = next[k];
		}
	}
}

int KmpSearch(char* s, char* p)
{
	int i = 0;
	int j = 0;
	int sLen = strlen(s);
	int pLen = strlen(p);
	int* next = new int[pLen];
	

	GetNextval(p,next);
	while (i < sLen && j < pLen)
	{
		//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++    
		if (j == -1 || s[i] == p[j])
		{
			i++;
			j++;
		}
		else
		{
			//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]    
			//next[j]即为j所对应的next值      
			j = next[j];
		}
	}
	if (j == pLen)
		return i - j;
	else
		return -1;
}

int main()
{
	char* s = "a is a good girl";
	char* p = "good";

	cout<<"we can find the word in the position:"<<KmpSearch(s,p)<<endl;
	getchar();
	return 0;
}


 

转载于:https://www.cnblogs.com/wuyida/p/6301413.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种高效的字符串匹配法,它通过预处理模式串,构建next数组,来实现在匹配过程中跳过些不必要的比较。下面是KMP算法的C++代码实现[^1]: ```cpp #include <iostream> using namespace std; const int MAXLEN = 255; typedef struct { char ch[MAXLEN]; int length; } SString; void GetNext(SString T, int next[]) { int i = 1, j = 0; next = 0; while (i < T.length) { if (j == 0 || T.ch[i] == T.ch[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } } } int Index_KMP(SString S, SString T, int next[]) { int i = 1, j = 1; while (i <= S.length && j <= T.length) { if (j == 0 || S.ch[i] == T.ch[j]) { ++i; ++j; } else { j = next[j]; } } if (j > T.length) { return i - T.length; } return 0; } int main() { SString S, T; S.length = 10; T.length = 3; strcpy(S.ch, "ababcabcac"); strcpy(T.ch, "abc"); int next[MAXLEN]; GetNext(T, next); int pos = Index_KMP(S, T, next); if (pos != 0) { cout << "匹配成功,位置为:" << pos << endl; } else { cout << "匹配失败" << endl; } return 0; } ``` 以上是KMP算法的C++代码实现。在代码中,我们首先定义了一个结构体SString来表示字符串,包含一个字符数组ch和一个长度length。然后,我们实现了GetNext函数来计算模式串T的next数组,用于在匹配过程中跳过不必要的比较。接着,我们实现了Index_KMP函数来进行KMP算法的匹配过程。最后,在main函数中,我们定义了两个字符串S和T,并调用GetNext函数计算T的next数组,然后调用Index_KMP函数进行匹配,并输出匹配结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值