TheAlgorithms-C/leetcode/src/28.c

105 lines
2.2 KiB
C
Raw Normal View History

/*
* 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;
}
/* ---------------------------------------------------------------------------------------- */