#include <string>
using namespace std;
//來自網絡
//以計算下一個元素的next值爲中心
static void preKmp(const char *x, int len, int kmpNext[])
{
int i, j;
i = 0;
j = kmpNext[0] = -1;
while (i < len)
{
while (j > -1 && x[i] != x[j])
j = kmpNext[j];
i++;
j++;
if (x[i] == x[j])
kmpNext[i] = kmpNext[j];
else
kmpNext[i] = j;
}
}
//原創
//以計算當前next值爲中心
//在while循環中修正next會錯過修正之間的序列
static void MyPreKmp( const char* x, int len, int kmpNext[] )
{
kmpNext[0] = -1;
int index = 1;
while ( index < len )
{
//計算index處的next值
int i = index-1;
while ( true )
{
int j = kmpNext[ i ];
if ( -1 == j || x[ j ] == x[ index-1 ] )
{
kmpNext[ index ] = j+1;
break;
}
i = j;
}
index++;
}
for ( int i=1; i<len; i++ )
{
if ( x[i] == x[ kmpNext[i] ] )
kmpNext[i] = kmpNext[ kmpNext[i] ];
}
}
void main()
{
string s ="abaabcac";
int buffer[ 100 ];
MyPreKmp( s.c_str(), s.size(), buffer );
preKmp( s.c_str(), s.size(), buffer );
}
KMP算法非遞歸實現——菜鳥與高手的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.