精易论坛
标题:
KMP分享
[打印本页]
作者:
shituo
时间:
2021-8-3 01:46
标题:
KMP分享
void kmp_init(const char *s, int *prefix, size_t size) {
prefix[0] = 0;
for (size_t i = 1; i < size; ++i) {
if (s[i] == s[prefix[i - 1]])
prefix[i] = prefix[i - 1] + 1;
else {
int j = i - 1;
while (prefix[j] > 0 && s[prefix[j]] != s[i])
j = prefix[j] - 1;
if (prefix[j] > 0)
prefix[i] = prefix[j] + 1;
else {
prefix[i] = (s[i] == s[0]);
}
}
}
}
int strStr(const char *src, const char *dest) {
if (!dest || !src)
return -1;
if (!*dest)
return 0;
size_t size = strlen(dest);
int *prefix = malloc(sizeof(int) * size);
kmp_init(dest, prefix, size);
size_t i, j;
for (i = j = 0; src[i] && j < size; ++i) {
if (dest[j] == src[i]) {
++j;
}
else if (j) {
while (prefix[j - 1] > 0 && dest[prefix[j - 1]] != src[i])
j = prefix[j - 1];
if (prefix[j - 1] > 0) {
j = prefix[j - 1] + 1;
}
else {
j = (dest[0] == src[i]);
}
}
}
free(prefix);
if (j < size)
return -1;
return i - size;
}
复制代码
作者:
haduke
时间:
2021-8-3 08:47
易论坛,你给我来个C?
作者:
shj0205
时间:
2021-8-3 09:24
支持开源~!感谢分享
作者:
易神
时间:
2021-8-3 10:18
支持开源~!感谢分享
作者:
tian89
时间:
2021-8-3 23:20
这个寻找是用C函数写的那里面是否越过\0也就结束符?易语言的寻找字节集可以越过去!我看了微软网站的C函数都是以结束符在判断终止寻找的!一旦字符串中间有结束符后边就寻找不到了
作者:
懒人定制软件
时间:
2021-8-5 01:04
这么厉害!必须给个红包鼓励下~
作者:
ghost12
时间:
2022-1-24 00:01
我读书少,不要骗我
作者:
ctry78985
时间:
2022-11-11 15:31
支持开源~!感谢分享
作者:
清风徐来2
时间:
2022-12-20 17:00
感谢分享
欢迎光临 精易论坛 (https://125.confly.eu.org/)
Powered by Discuz! X3.4