本题要求实现一个字符串查找的简单函数。
函数接口定义:
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
浅写一次Kmp, 属实是大才小用了
int nextval[99];
int get_nextval(char *t, int nextval[])
{
int j = 0, k = -1;
nextval[0] = -1;
while(j < strlen(t))
{
if(k == -1 || t[j] == t[k])
{
k++;
j++;
nextval[j] = k;
}
else k = nextval[k];
}
}
char *search(char *s, char *t)
{
int lens1 = strlen(s);
int lens2 = strlen(t);
get_nextval(t, nextval);
int i = 0, j = 0;
while(i < lens1 && j < lens2)
{
if(j == -1 || s[i] == t[j]){
i++;
j++;
}
else
j = nextval[j];
}
if(j == lens2){
return s + i - j;
}
else
return NULL;
}