mirror of
https://github.moeyy.xyz/https://github.com/TheAlgorithms/C.git
synced 2023-10-11 15:56:24 +08:00
105 lines
2.2 KiB
C
105 lines
2.2 KiB
C
/*
|
|
* brute force approach
|
|
* time complexity: O(mn)
|
|
*/
|
|
int strStr(char* haystack, char* needle) {
|
|
int i = 0;
|
|
int j = 0;
|
|
int k = 0;
|
|
int hlen = 0;
|
|
int nlen = 0;
|
|
|
|
if(needle == NULL || *needle == 0)
|
|
return 0;
|
|
|
|
if(haystack == NULL || *haystack == 0)
|
|
return -1;
|
|
|
|
hlen = strlen(haystack);
|
|
nlen = strlen(needle);
|
|
|
|
if(hlen < nlen)
|
|
return -1;
|
|
|
|
for(i = 0; i <= hlen - nlen; i++) {
|
|
j = 0;
|
|
if(haystack[i] != needle[j++])
|
|
continue;
|
|
|
|
k = i + 1;
|
|
for(; j < nlen; j++) {
|
|
if(haystack[k] != needle[j]) {
|
|
break;
|
|
} else
|
|
k++;
|
|
}
|
|
if(j == nlen)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* KMP algorithm
|
|
* time complexity: O(m + n)
|
|
*/
|
|
|
|
/* fills overlap with longest proper prefix which is also suffix for each index in needle */
|
|
void fill_overlap(char *needle, int len_needle, int *overlap)
|
|
{
|
|
int len = 0;
|
|
int i = 0;
|
|
|
|
overlap[0] = 0;
|
|
|
|
for (i = 1; i < len_needle;) {
|
|
if (needle[i] == needle[len]) {
|
|
len++;
|
|
overlap[i++] = len;
|
|
} else {
|
|
if (len)
|
|
len = overlap[len - 1];
|
|
else
|
|
overlap[i++] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
int strStr(char *haystack, char *needle)
|
|
{
|
|
int i = 0; /* index for haystack */
|
|
int j = 0; /* index for needle */
|
|
|
|
int len_needle = strlen(needle);
|
|
int len_haystack = strlen(haystack);
|
|
|
|
if (!len_needle)
|
|
return 0;
|
|
|
|
int overlap[len_needle];
|
|
|
|
fill_overlap(needle, len_needle, overlap);
|
|
|
|
while (i < len_haystack) {
|
|
if (needle[j] == haystack[i]) {
|
|
i++;
|
|
j++;
|
|
}
|
|
|
|
if (j == len_needle) {
|
|
return (i - j);
|
|
} else if (i < len_haystack && needle[j] != haystack[i]) {
|
|
if (j != 0)
|
|
j = overlap[j - 1];
|
|
else
|
|
i = i + 1;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------- */
|
|
|