// ********************************* //
// kmp by Ceja
// ********************************* //
#include <tchar.h>
// kmp ==============
inline int* GetNextVal_i(const TCHAR *s, int &len);
inline int* GetNextVal(const TCHAR *s, int &len)
{
len = (int)_tcslen(s);
int *next = new int[len];
int i = 0;
int j = -1;
next[0] = -1;
while(i<len-1)//注意这里跟KMP函数里面的不同
{
if(j==-1 || s[i]==s[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
// kmp 算法, 大小写敏感
inline int KMP(const TCHAR *s, const TCHAR *t)
{
int slen,tlen;
int i,j;
int *next = GetNextVal(t, tlen);
slen = (int)_tcslen(s);
i = 0;
j = 0;
while(i<slen && j<tlen)
{
if(j==-1 || s[i]==t[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
delete[] next;
if(j==tlen)
return i - tlen;
return -1;
}
// kmp 算法, 大小写不敏感
inline int KMP_i(const TCHAR *s, const TCHAR *t)
{
int slen,tlen;
int i,j;
int *next = GetNextVal_i(t, tlen);
slen = (int)_tcslen(s);
i = 0;
j = 0;
while(i<slen && j<tlen)
{
if(j==-1 || ( ((_T('a') <= s[i] && _T('z') >= s[i])?(s[i] - 32):s[i]) == ((_T('a') <= t[j] && _T('z') >= t[j])?(t[j] - 32):t[j])))
{
++i;
++j;
}
else
{
j = next[j];
}
}
delete[] next;
if(j==tlen)
return i - tlen;
return -1;
}
inline int* GetNextVal_i(const TCHAR *s, int &len)
{
len = (int)_tcslen(s);
int *next = new int[len];
int i = 0;
int j = -1;
next[0] = -1;
while(i<len-1)//注意这里跟KMP函数里面的不同
{
if(j==-1 || ( ((_T('a') <= s[i] && _T('z') >= s[i])?(s[i] - 32):s[i]) == ((_T('a') <= s[j] && _T('z') >= s[j])?(s[j] - 32):s[j])))
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
return next;
}
/// ***** end of kmp
TCHAR,大小写敏感/不敏感的KMP算法
最新推荐文章于 2023-08-24 11:15:34 发布