33,006
社区成员
发帖
与我相关
我的任务
分享
void yc_kmp_init(const char *str_patn, size_t sz_patn, size_t *psz_table)
{
size_t i, j;
assert ( str_patn );
psz_table[0] = 0;
for ( i = 1, j = 0; i < sz_patn; ++i )
{
while ( j > 0 && str_patn[j] != str_patn[i] )
{
j = psz_table[j-1];
}
if ( str_patn[j] == str_patn[i] )
{
++j;
}
psz_table[i] = j;
}
}
char * yc_kmp_find(const char *str_text, size_t sz_text, const char *str_patn, const size_t *psz_table, size_t sz_patn )
{
size_t i, j;
assert( str_text && str_patn && psz_table );
for ( i = 0, j = 0; i < sz_text; ++i )
{
while ( j && str_text[i] != str_patn[j])
{
j = psz_table[j - 1];
}
if ( str_text[i] == str_patn[j] )
{
++j;
}
if ( sz_patn == j )
{
return (char*)str_text + i + 1 - sz_patn;
}
}
return NULL;
}
char * yc_strstr_kmp(const char *str_text, const char *str_patn)
{
char *str_rtn = NULL;
size_t sz_patn, sz_text;
assert( str_text && str_patn );
sz_patn = strlen(str_patn);
sz_text = strlen(str_text);
if ( sz_patn && sz_text )
{
size_t *psz_table = (size_t*)malloc(sizeof(size_t)*sz_patn);
if ( psz_table )
{
yc_kmp_init(str_patn, sz_patn, psz_table);
str_rtn = yc_kmp_find(str_text, sz_text, str_patn, psz_table, sz_patn);
free(psz_table);
}
else
{
str_rtn = (char*)strstr(str_text, str_patn);
}
}
return str_rtn;
}