kmp算法

来源:互联网 发布:淘宝企业店铺如何过户 编辑:程序博客网 时间:2024/05/18 02:29

 #include <iostream>

#include <string>

using namespace std;

//关键的问题是要理解 该方法是获得下次比较的字符位置 0位置是一个特殊值

//当前位置的值是根据相邻的字符获得的与本身无关

void GetNext( string& s, int iArr[] )
{
const int iLen = s.length();


iArr[0] = -1;
int i = 0;
int j = -1;


while( i < iLen )
{
if( j == -1 || s[i] == s[j] )
{
++i;
++j;
iArr[i] = j;
}
else 
{
j = iArr[j];
}
}
}

//获得字串位置
int GetPos( string& s, string sSub )
{
int iArr[100];
GetNext( sSub, iArr );


const int iLen = s.length();
const int iSub = sSub.length();


int i = 0;
int j = 0;
while( i < iLen && j < iSub )
{
if( s[i] == sSub[j] )
{
++i;
++j;
}
else
{
j = iArr[j];


if( j == -1 )
{
++i;
j = 0;
}
}
}


if( j >= iSub && i <= iLen )
{
return i - iSub;
}


return -1;
}


void main()
{
int iArr[14];
string s = "abcdabcefgcda";
string sSub = "gcda";
int iPos = GetPos( s, sSub );
cout << iPos << endl;

}

0 0
原创粉丝点击