您的位置:首页 > 编程语言 > C语言/C++

C++实现的KMP算法

2013-02-27 22:11 381 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法