KMP算法

NEXT求取

KMP算法求next-CSDN博客

查找主串中是否有子串,使用c语言实现:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void get_next(char* TS, char* next, int len);
void scan_position(char* TS, char* c, char* next);
 
int main()
{
    char c[]="abcabcmn";          //查找的子串
    char T[]="abcabeabcabcmn";    //主串
	int len=strlen(c);
    char *next=(char *) malloc(len);
    
    if(next == NULL)                
      printf("request Error\r\n");//申请空间失败
   
   get_next(c, next, len);        //获取next值
   
   scan_position(T, c, next);    //查找主串中是否有子串
 
 
   int i=0;                       //打印next值
   while(i<len)
      printf("%d  ", next[i++]);
 
   free(next); 
   return 0;
}
 
void get_next(char* TS, char* next, int len)
{
	int i=0,j=0;
   len--;next[0]=-1;
	while(j<len)                          
	{
		if(j==0||TS[i]!=TS[j])
        {
            if(i) i=0;
            else next[++j]=0;
        }
		else{ next[++j]=++i; } 
	}  
}
 
void scan_position(char* TS, char* c, char* next)
{
   int i=0,j=0;
   int  len=strlen(TS);
   int  clen=strlen(c);
   char *str=NULL;
	str=(char*)malloc(clen);
   while(i<len&&j<clen)
   {
      if(TS[i]==c[j])
      {
         i++,j++;
      }else{
         if(j==0)i++;
         else j = next[j];
      } 
   }
   
   if(j!=clen)  printf("'%s'中没有找到'%s'\r\n", TS, c);
   else{
	   memcpy(str, TS+i-j, j);
	   printf("T:%d %s\r\n", i-j, str);  
   }   
   free(str);
}

 

个人理解:

        KMP算法,找到与头部相同的字符串,把每个位的相同数记录下来(next),这样能够为遍历时节约一部分回溯时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂可欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值