快速匹配算法(KMP)

77 篇文章 0 订阅
60 篇文章 0 订阅
快速匹配算法(KMP) ,核心之处在于:

主串指针不用回溯,直接前进!!!

关键之处在于: NEXT[i]的值的求法,KMP算法其实很简洁的!!!


==================================================================

/* KMP algorithms for string comparse...*/
#include <stdio.h>
#include <string.h>
#define MAX 101

void get_next ( int next[],char s2[],int l2)/* 求NEXT的值*/
{
     int i=1 ,j=0 ;
     next[1] = 0 ;
    
     for( ; i < l2 ; )
     {
          if ( j== 0 || s2[i] == s2[j] )
          {
               ++i ;
               ++j ;
               if ( s2[i] != s2[j])
               next[i] = j ;
               else
               next[i] = next[j] ;
          }
          else
          j = next[j] ;
     }
}
int compares(char s1[],char s2[] ,int l1, int l2,int next[],int start)/*匹配算法*/
{
    int i=start ,j=1 ;
   
    for( ; i <= l1 && j <= l2; )
    {
         if ( j == 0 || s1[i] == s2[j] )
         {
              ++ i ;
              ++ j ;
         }
         else
         j = next[j] ;
    }
   
    if ( j > l2 )
    return (i-l2) ;
    else
    return 0 ;
}
                  
int main(void)
{
   char c,s1[MAX]={'\0'},s2[MAX]={'\0'};
   int i,j,k,l1=0,l2=0,start;
   int next[MAX] ={0} ;
  
   for(; (c = getchar())!= ' '; )
    {
         s1[++l1] = c ;
        
    }
   for(; (c = getchar() ) != '\n' ; )
   {
         s2[++l2] = c ;
   }
   printf("Please input where are you want to comparse: ");
   scanf("%d",&start);
   
   get_next(next,s2,l2);
  
   printf("====result come out ==========\n");
   k = compares(s1,s2,l1,l2,next,k) ;
   
   if ( k )
   printf("OK!!!,S2 in S1's place is : %d\n",k);
   else
   printf("NOT OK!!!\n");
  
   system("pause");

   return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值