字符串匹配算法之AC search
C++编写
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
string str = "you";
string txt = "youhello yorld you are youomymal jhyouoeyou";
cout<<str<<endl<<txt<<endl<<"*****************************"<<endl;
vector<int> marks(256,-1); //初始化,只有在匹配串中出现的字符才 != -1
for(int i=str.size()-1,j=0; i>=0 && j<256; i--,j++) {
if(-1 == marks[str[i]]) //还未处理str[i]字符
marks[str[i]] = i; //表示当前字符str[i]前面还存在的字符个数
}
int i=0, j=0; //i->txt, j->str
while(i < txt.size()) {
for(; j<str.size(); j++) { //重新匹配时j=0
if(txt[i] == str[j]) //如果相等,str和txt各自向前推进一步,继续匹配
i++;
else { //不相等,i向前跳跃str.size()长度比较
i = i+str.size();
while(i <= txt.size() && marks[txt[i]]==-1) {
i = i+str.size();
}
if(i > txt.size()) { //如果因为超出范围退出while,说明匹配失败
return -1;
}
else {
i = i-marks[txt[i]]; //当前匹配的字符在str中
j=-1;
}
}
}
if(j == str.size()) { //匹配成功
for(int k=i-j; k<txt.size(); k++)
cout<<txt[k];
cout<<endl;
//break; //匹配成功就退出
j=0;
}
}
return 0;
}