TCHAR,大小写敏感/不敏感的KMP算法

// ********************************* //
// 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值