lecode-28 找出字符串中第一个匹配项的下标
今天来看一道典型的kmp算法题目,目前使用的是最初版的kmp算法,关于kmp算法,后续也会更新该算法的详解以及改进算法。
这道题被定义为简单是因为他可以使用暴力算法解出,如果使用kmp算法就没那么好理解了,但是kmp算法的效率能达到O(m+n),这里我使用的是原始的kmp算法,kmp算法关键点就在于求解next数组,next数组的求解在理解其原理后10行左右代码可以搞定,源码如下:
void get_prefix_table(char *s, int next[])
{
int i = 1, j = 0;
int len = strlen(s);
for ( i = 1, j = 0; i < len;)
{
if (s[i] == s[j]){
next[i++] = ++j;
}else if (j == 0){
next[i++] = 0;
}else {
j = next[j - 1];
}
}
}
详细解释我们后面专门开一期结合动图慢慢讲。
求解出next表后就可以很轻松的查找子串在父串中出现的下标位置了。代码如下:
void get_prefix_table(char *s, int next[])
{
int i = 1, j = 0;
int len = strlen(s);
for ( i = 1, j = 0; i < len;)
{
if (s[i] == s[j]){
next[i++] = ++j;
}else if (j == 0){
next[i++] = 0;
}else {
j = next[j - 1];
}
}
}
int strStr(char* haystack, char* needle) {
int next[strlen(needle)] ;
int i = 0, j = 0;
next[0] = 0;
get_prefix_table(needle, next);
for (i = 0, j=0; i < strlen(haystack);)
{
if (haystack[i] == needle[j])
{
i++;
j++;
if (j == strlen(needle))
return i - j;
continue;
}
if (j != 0)
j = next[j-1];
else
i++;
}
return -1;
}
lecode通过截图
时间复杂度
25293723065)]
时间复杂度
[外链图片转存中…(img-wJ4FJHA5-1725293723066)]