easy程度题
题目:
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
字符串匹配,暴力匹配复杂度O(M * N)AC解:
class Solution {
public:
int strStr(string haystack, string needle)
{//暴力匹配
int lengthA = haystack.length();
int lengthB = needle.length();
if (lengthB == 0)
return 0;
if (lengthA < lengthB)
return -1;
for (int i = 0; i <= lengthA - lengthB; i++)
{
int count = 0;
while (count < lengthB && haystack[i + count] == needle[count])
count++;
if (count == lengthB)
return i;
}
return -1;
}
};KMP快速匹配
class Solution {
public:
int strStr(string haystack, string needle)
{//KMP快速匹配算法
int lengthA = haystack.length();
int lengthB = needle.length();
if (lengthB == 0)
return 0;
if (lengthA < lengthB)
return -1;
int *next = new int [lengthB];
makeNext(needle,next);
return KMPSearch(haystack,needle,next);
}
inline void makeNext(string p,int *next)
{
int len = p.length();
next[0] = -1;
int k = -1, j = 0;
while (j < len - 1)
{
while (k >= 0 && p[j] != p[k])
k = next[k];
j++;
k++;
if (p[j] == p[k])
next[j] == next[k];
else
next[j] = k;
}
}
inline int KMPSearch(string s, string p, int *next)
{
int i = 0, j = 0;
int slen = s.length(), plen = p.length();
while (i < slen && j < plen)
{
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == plen)
return i - j;
else
return -1;
}
};具体思想参见其它博文,刚学的时候花了几个小时弄懂了,过段时间再次遇到还是写不出代码来- -

本文介绍两种实现strStr()的方法:一种是简单的暴力匹配,时间复杂度为O(M*N);另一种是利用KMP算法进行快速匹配。文中详细展示了两种方法的C++代码实现,并解释了KMP算法中next数组的构建过程。
496

被折叠的 条评论
为什么被折叠?



