串的匹配算法_BF算法与KMP算法

发布于:2022-12-06 ⋅ 阅读:(454) ⋅ 点赞:(0)

(本文推荐电脑观看)

串的模式算法——————BF算法

算法的思路:从S(主串)的每一个字符开始依次与T(模式串)的字符进行匹配 (从0开始) 

int Index_BF(SString S,SString T){

 int i=1,j=1;

 while(i<=S.length && j<=T.length){

  if(S.ch[i]==T .ch[j])

  {++i; ++j;} //主串和子串依次匹配下一个字符

  else {i=i-j+2 ; j=1} //主串、子串指针回溯重新开始下一次匹配 

 }

 if(j > T.length) return i-T.length; //返回匹配的第一个字符的下标

 else return 0;//模式匹配不成功 

 

串的匹配算法——————KMP算法

  定义next[j]函数表明当模式中第j个字符与主串中相应字符“失败”时,在模式中需要重新和主串中该字符进行比较的字符的位置

  

       j: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

  --------------------------------------------------

  模式串: | a b c a a b b c a b c a a b d a b

  --------------------------------------------------

 next[j]: | 0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2

 

 KMP算法: 

 int Index_KMP(SString S,SString T,int pos){

  i=pos,j=1;

  while(i<S.length && j<T.length){

   if(j == 0 || S.ch[i]==T.ch[j]) {i++;j++}

   else j = next[j]; //i不变,j后退 

  }

  if( > T.length) return i-T.length; //匹配成功

  else return 0; //返回不匹配标志 

 } 

 

 KMP算法改进型:增加nextval

 void get_nextval(SString T,int & nextval[]) {

  i=1; nextval[1]=0; j=0;

  while(i<T.length){

   if(J==0 ; || T.ch[i]==t.ch[j]){

    ++i; ++j;

    if(T.ch[i]!=T.ch[j]) nextval[i]=j;

    else nextval[i] = nextval[j];

   }

   else j=nextval[j];

  }

 }


网站公告

今日签到

点亮在社区的每一天
去签到