/*
*函数功能
* 求字符串str中从pos位置开始第一次出现pat的位置
*输入参数
* char *str:要查找的字符串
* char *pat:模式串
* int pos:开始位置
*返回值
* 返回字符串str中从pos位置开始第一次出现pat的位置,如果从pos位置开始不存在pat则返回-1
*
*/
int KMPIndex(char *str, char *pat, int pos)
{
int i=pos, j=0;
int *next = NULL;
int slen = strlen(str), plen = strlen(pat);
if(pos<0 || pos>slen-plen)
{
return -1;
}
if((next=(int*)malloc(sizeof(int)*plen)) == NULL) exit(1); //分配空间失败
getNext(pat, next); //获得模式串pat的next数组
while(i<slen && j<plen)
{
if(j==-1 || str[i]==pat[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
free(next);
if(j==plen)
{
return i-j;
}
return -1;
}
/*
*函数功能
* 求模式串pat的next值数组
*输入参数
* char *pat:模式串
* int next[]:next数组
*返回值
* 无
*
*/
void getNext(char *pat, int next[])
{
int i=0, j=-1;
int plen = strlen(pat);
next[0] = -1;
while(i < plen-1)
{
if(j==-1 || pat[i]==pat[j])
{
++i;
++j;
if(pat[i]==pat[j])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
}
}
*函数功能
* 求字符串str中从pos位置开始第一次出现pat的位置
*输入参数
* char *str:要查找的字符串
* char *pat:模式串
* int pos:开始位置
*返回值
* 返回字符串str中从pos位置开始第一次出现pat的位置,如果从pos位置开始不存在pat则返回-1
*
*/
int KMPIndex(char *str, char *pat, int pos)
{
int i=pos, j=0;
int *next = NULL;
int slen = strlen(str), plen = strlen(pat);
if(pos<0 || pos>slen-plen)
{
return -1;
}
if((next=(int*)malloc(sizeof(int)*plen)) == NULL) exit(1); //分配空间失败
getNext(pat, next); //获得模式串pat的next数组
while(i<slen && j<plen)
{
if(j==-1 || str[i]==pat[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
free(next);
if(j==plen)
{
return i-j;
}
return -1;
}
/*
*函数功能
* 求模式串pat的next值数组
*输入参数
* char *pat:模式串
* int next[]:next数组
*返回值
* 无
*
*/
void getNext(char *pat, int next[])
{
int i=0, j=-1;
int plen = strlen(pat);
next[0] = -1;
while(i < plen-1)
{
if(j==-1 || pat[i]==pat[j])
{
++i;
++j;
if(pat[i]==pat[j])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
}
}