-----QUESTION-----
Implement strStr().
Returns a pointer to the first occurrence of needle in haystack,or
-----SOLUTION-----
class Solution {
public:
char *strStr(char *haystack, char *needle) {
int hayLen = strlen(haystack);
int needleLen = strlen(needle);
int next[needleLen];
get_nextval(needle, next);
if (hayLen == 0 && needleLen != 0)
return NULL;
if (hayLen == 0 || needleLen == 0)
return haystack;
int i = 0, j = 0;
while(i < hayLen && j < needleLen)
{
if(haystack[i] != needle[j])
{
if(next[j]!=-1)
j=next[j];
else
{
j=0;
i++;
}
}
else
{
i++;j++;
}
}
if(j==needleLen) return haystack+i-needleLen;
return NULL;
}
void get_nextval(const char *T, int next[])
{
int j = 0, k = -1;
next[0] = -1;
while ( T[j] != '\0' )
{
if (k == -1 || T[j] == T[k]) //字符相等,或者是字符不相等且没有上一个匹配位置了
{
++j; ++k;
if (T[j]!=T[k]) //前一个字符相等,这个字符不相等
next[j] = k; //下一次从k开始判断(因为k-1都已经匹配相等)
else //相等,下一次开始判断的位置和k位置下次开始判断的位置相同
next[j] = next[k];
}
else //字符不相等,模式串移到上一个匹配位置继续匹配
k = next[k];
}
}
};
*****简单的字符串查找会造成Time limit exceeded*****
class Solution {
public:
char *strStr(char *haystack, char *needle) {
int hayLen = strlen(haystack);
int needleLen = strlen(needle);
if (hayLen == 0 && needleLen != 0)
return NULL;
if (hayLen == 0 || needleLen == 0)
return haystack;
for(int i = 0; i< hayLen; i++)
{
int j = 0;
for(; j< needleLen; j++)
{
if(haystack[j+i] != needle[j]) break;
}
if (j == needleLen) return &haystack[i];
}
return NULL;
}
};