28 Implement strStr()
链接:https://leetcode.com/problems/implement-strstr/
问题描述:
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Update (2014-11-02):
The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a char * or String, please click the reload button to reset your code definition.
Hide Tags Two Pointers String
给出字符串 haystack和needle,找到haystack中含有子串needle的最小位置。如果haystack找不到needle则返回-1。我想到的方法是依次匹配,找到就返回,否则就返回-1;
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle=="") return 0;
int i=0,j=0;
for(;i<haystack.size();i++)
{
if(haystack[i]==needle[j])
j++;
else
{
i=i-j;
j=0;
continue;
}
if(j==needle.size())
return i-j+1;
}
return -1;
}
};
其实KMP算法就是为了解决这个问题,关于KMP算法这篇博客写的已经登峰造极了。代码如下:
class Solution {
public:
int * GetNextval(string needle)
{
int pLen = needle.length();
int *next=new int[pLen];
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1)
{
if (k == -1 || needle[j] == needle[k])
{
++j;
++k;
if (needle[j] != needle[k])
next[j] = k;
else
next[j] = next[k];
}
else
{
k = next[k];
}
}
return next;
}
int strStr(string haystack, string needle) {
int *next=GetNextval(needle);
int sLen = haystack.length();
int pLen = needle.length();
int i = 0;
int j = 0;
while (i < sLen && j < pLen)
{
if (j == -1 ||haystack[i] == needle[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == pLen)
return i - j;
else
return -1;
}
};