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;
}
};
具體思想參見其它博文,剛學的時候花了幾個小時弄懂了,過段時間再次遇到還是寫不出代碼來- -