标签:style blog http color ar for sp strong div
一、坏字符与模式串滑动
坏字符是串S中引起匹配失败的字符,坏字符又能够分为两类:S: "abbadcababacab", T: "babac", 串S中的字符d就是一个坏字符
    
    对于这样的情况,我们直接把模式串向后移动使其T[0]与d的下一位对其,然后从后開始进行下一轮匹配;
    2. 坏字符串在模式串中,如上面样例移动后,从后往前比較,b和c不同样,而字符b在模式串T中出现,此时就把模式串移动到模式串的该字符和串的该坏字符对其,可是假设该坏字符在模式串种出现了不止一次,我们怎么移动了?这时候,为了保守起见,我们移动模式串使模式串种最右端的坏字符和串的该坏字符对其,例如以下:
    
    假设依照最以下的方法移动,和最左端的字符对其,则可能会漏掉匹配项,如上图所看到的。
二、知道了坏字符和怎样滑动模式串了,计算移动步伐step
    代码的难处在遇到坏字符后该怎样移动模式串,即计算移动步伐(step)。
    1. 对于第一种情况,坏字符不在模式串中,直接就T[0]移动到该位置之后, 
    
     //update 2014-06-07
     int horspool(const char *S, const char *T){
          if(S==NULL || T==NULL) return -1;
          int n = strlen(S);
          int m = strlen(T);
          int table[256] = {-1};
          //记录模式串中字符出现的最右位置
          for(int i=0; i<m; ++i)
               table[ T[i] ] = i;
          //移动步伐
          int step = 0;
          for(int i=0; i+m<=n; i+=step){
               step = 0;
               //開始匹配,从右往左匹配
               for( int j=m-1; j>=0; --j){
                    if( S[i+j] != T[j] ){
                         step = j-table[ S[i+j] ];
                         //防止原地踏步
                         if(step <1 )  step = 1;
                         //本轮匹配失败,从新位置開始比較
                         break;
                    }
               }
               //一轮匹配结束后,没有匹配失败的,说明匹配成功
               if(step == 0)  return i;
          }
          return -1;  //匹配失败
     }
标签:style blog http color ar for sp strong div
原文地址:http://www.cnblogs.com/lcchuguo/p/4059444.html