#include <iostream>
#include <string>
using namespace std;
int Index(const string& s, const string& t, int pos) //普通字符串算法
{
int i = pos;
int j = 0;
int iLengthS = s.length();
int iLengthT = t.length();
while (i < iLengthS && j < iLengthT)
{
if (s[i] == t[j])
{
++j;
++j;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= iLengthT)
{
return i - iLengthT;
}
else
{
return 0;
}
}
void getNext(const string& pattern,int next[]) //求串的模式值
{
next[0]=-1;
int k=-1;
int j=0;
while(pattern[j] != '\0')
{
if(k != -1 && pattern[k] != pattern[j] )
k = next[k];
++j;
++k;
if(pattern[k] == pattern[j])
next[j] = next[k];
else
next[j] = k;
}
这里是我加的显示部分
for(int i=0;i<j;i++)
{
cout<<next[i];
}
cout<<endl;
}
int KMP(const string& Text,const string& Pattern) //const 表示函数内部不会改变这个参数的值。
{
if(Pattern.length() <= 0 || Text.length() <= 0 )
{
return -1;//空指针或空串,返回-1
}
int iLengthPat = Pattern.length();
int *next=new int[iLengthPat + 1];
getNext(Pattern, next);//求Pattern的next函数值
int index=0;
int i=0;
int j=0;
while(Text[i] != '\0' && Pattern[j] != '\0')
{
if(Text[i] == Pattern[j])
{
++i;// 继续比较后继字符
++j;
}
else
{
index += j-next[j];
if(next[j]!=-1)
j=next[j];// 模式串向右移动
else
{
j=0;
++i;
}
}
}//while
delete []next;
if(Pattern[j]=='\0')
return index;// 匹配成功
else
return -1;
}
int main()
{
string text="abcdef1234";
string pattern="ef1";
cout<<KMP(text,pattern)<<endl;
return 0;
}
C++实现的KMP算法
最新推荐文章于 2022-02-01 16:12:22 发布