再谈kmp算法 , 由poj3461

本文深入讲解KMP算法的实现原理及应用,通过两种next数组计算方法对比,展示如何避免传统BF算法中的回溯操作,提高字符串匹配效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kmp算法相对于BF算法是不要回溯 , 不需要回溯 , 是因为在匹配过程中 , 不移动匹配串只移动模式串。


在求解next数组时 , 下面使用了两种方法。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

char s[1000000]; //被匹配字符串
char t[100000]; //匹配字符串
int next[100000];  //存储匹配串中每个字符应移的距离
int s_length , t_length;//被匹配串和匹配串的字符长度

/*void getnext(void)
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<t_length)
    {
        if(j==-1||t[i]==t[j])
        {
            i++;//如果i=len-1,执行这步会使next[len]存在
            j++;
            next[i]=j;
        }
        else
        {
            j=next[j];
        }
    }
}*/
void getnext()
{
	int i = 0, j =-1;
	next[i] = -1;
	while(i <= t_length)
	{
		while(j >= 0 && t[i] != t[j])  j = next[j]; //和该字符前面的字符比较 , 看是否和前面的字符相同
		
		i++;  j++;
		
		if(t[i] == t[j])  next[i] = next[j];//如果当前两字符相同 , 
		else next[i] = j;
	}
	
}
//向右滑动的距离为:j-next[j]
int main()
{
		  int case1;
		  scanf("%d" , &case1);
		  while(case1--)
		  {
			  
			  int i , j , sum = 0;
			  scanf("%s" , t);
			  scanf("%s" , s);
			  
			  s_length = strlen(s);
			  t_length = strlen(t);
			  
			  if(s_length < t_length)
			  {
				  printf("0\n");
				  continue;
			  }
			  getnext();
			  for(i = 0; i <= t_length; i++)
				  printf("%d   " , next[i]);
			  cout<<endl;
			  i = 0 , j = 0;
			  while(j < s_length)
			  {
				  //int z = j;
				  while(i == -1 || (i < t_length && s[j] == t[i]))  j++ , i++;
				  if(i >= t_length)
				  {
					 // printf("%d\n" , j);
					  sum += 1;
					  
					 
				  }		
				  i = next[i];
				  
			  }
			  cout<<sum<<endl;
		  }
		  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值