禅达的爱

字符串匹配代码--小学生的玩闹

#include <iostream>

#include<string>

using namespace std;

#define ASIZE 256

void preBmBc(char *x, int bmBc[]);

int BM(char *x, char *y);

void main()

{  

char x[5] ="wang";//可以自己改成手动输入

 char y[50]="012wagg789wangtaokingpc";

 int location;

 location = BM(x,y);  

 cout<<"模式串在目标串中出现的位置是: "<<location<<endl;

}

int BM(char *x, char *y)

{  

int m;//模式串的长度

 int n;//目标串的长度

 int i;//模式串中匹配的位置

 int j;//目标串中匹配的位置

 int bmBc[ASIZE];//对照表数组,用于比较后移

 preBmBc(x, bmBc);

 m = strlen(x);

 n = strlen(y);

 j=m-1;  

while (j < n)  {

    for (i =0; i <= m-1 && x[m-1-i] == y[j-i]; ++i);//从最后的y[m-1]开始匹配,一次向前;  

       if (i == m)      {          

            return j-m+1;//当完全匹配时,上一个跳出for循环i=-1;此时完全匹配成功,j为匹配模式所在位置     

       }     

       else      {         

            j += bmBc[y[j]];//匹配不成功,目标串进行后移,返回for循环再进行匹配     

        }

 }  

return -1;//j>=n,最终没有完成匹配

};

void preBmBc(char *x, int bmBc[])//对照表的生成

{  

int m;  int i;

 m = strlen(x);  

for (i=0;i<ASIZE;i++)  

{  

bmBc[i]=m;//默认的匹配向后的转移x的长度  

}  

for (i=0;i<m-1;i++)

 {  

bmBc[x[i]]=m-1-i;

//根据x的字符匹配转移,比如:                   

//y中匹配的时候是wwan,模式串是wang,那么n对应的是1,即y(目标串)后移一个,在进行对比就是wan*;

 }

};

 

 

 

posted on 2013-08-09 09:50  禅达的爱  阅读(175)  评论(0编辑  收藏  举报