Implement strStr().
题目意思:找到needle字符串在haystack字符串中第一次出现的下标,返回即可。
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
KMP算法
就是KMP算法,没撒子好分析的!
复习算法导论:http://blog.csdn.net/ebowtang/article/details/49129363
class Solution {
public:
//计算模式needle的部分匹配值,保存在next数组中
void MakeNext(const string &P, vector &next) {
int q, k;//k记录所有前缀的对称值
int m = P.size();
next[0] = 0;//首字符的对称值肯定为0
for (q = 1, k = 0; q < m; ++q)//计算每一个位置的对称值
{
//k总是用来记录上一个前缀的最大对称值
while (k > 0 && P[q] != P[k])
k = next[k - 1];//k将循环递减,值得注意的是next[k] next(m,0);
MakeNext(needle, next);
for (int i = 0, q = 0; i < n; ++i) //q记录当前相同字符数
{
while (q > 0 && needle[q] != haystack[i]) //跳过一些不必要的...速度就在这里被提升,
q = next[q - 1];
if (needle[q] == haystack[i]) //相等就增加q的个数
q++;
if (q == m) //等于needle的size时即可返回结果
return (i - m + 1);
}
return -1;
}
};
别人家的算法:
BF算法:暴力的模式匹配,DONE
class Solution {
public:
//简单模式匹配算法(BF算法)
int strStr(string haystack, string needle) {
int hlen = strlen(haystack.c_str());
int nlen = strlen(needle.c_str());
int i = 0, j = 0;
while (i < hlen && j < nlen)
{
if (haystack[i] == needle[j])//相等
{
i++;
j++;//增加相同字符个数
}
else{//两个字符串不相等,KMP在这里进行了优化
i = i - j + 1;
j = 0;//相同字符的个数置零
}
}
if (j == nlen)
return i - j;
else
return -1;
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50480410
原作者博客:http://blog.csdn.net/ebowtang