字符串匹配代码--小学生的玩闹
#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*;
}
};