使用KMP算法做(里面使用指针代替访问数组 效率更高)
题目:
本题要求实现一个字符串查找的简单函数。
函数接口定义:
char *search( char *s, char *t );
函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 30
char *search(char *s, char t);
void ReadString( char s[] ); / 裁判提供,细节不表 */
int main()
{
char s[MAXS], t[MAXS], *pos;
ReadString(s);
ReadString(t);
pos = search(s, t);
if ( pos != NULL )
printf("%d\n", pos - s);
else
printf("-1\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
The C Programming Language
ram
输出样例1:
10
输入样例2:
The C Programming Language
bored
输出样例2:
-1
代码:
char *search( char *s, char *t ){//KMP算法---指针改进版
int next[MAXS];
next[0]=-1;
int i = 0;
int k = -1;
int j = 0;
while(*(t+j)!='\0')
{
if(k==-1||*(t+k)==*(t+j)){
++k;
++j;
next[j] = k;
}
else
k = next[k];
}
int sum = j;
// printf("%d\n",j);
// for(int n=0;n<sum;++n)
// printf("%d\n",next[n]);
j = 0;
while(*(s+i)!='\0'&&j<(sum))
{
if(j==-1||*(s+i)==*(t+j))
{
++i;
++j;
}
else
{
j = next[j];
}
}
// printf("%d %d\n",j,i);
if(j>=sum)
return (s+i-j);
return NULL;
}