字符串查找(3) 使用一维数组保存回退位置
int strStr(string &haystack, string &needle)
{
const int needlesize = needle.size();
if (needlesize == 0)
{
return 0;
}
vector<int> next(needlesize, 0);
for (int i = 1, j = 0; i < needlesize; i++)
{
while (j && needle[j] != needle[i])
{
j = next[j - 1];
}
if (needle[j] == needle[i])
{
j++;
}
next[i] = j;
}
const int targetsise{ (int)haystack.size() };
for (int i = 0, j = 0; i < targetsise; i++)
{
while (j && haystack[i] != needle[j])
{
j = next[j - 1];
}
if (haystack[i] == needle[j])
{
j++;
}
if (j == needlesize)
{
return i - j + 1;
}
}
return -1;
}
一种优化过的KMP查找字符串算法
相对字符串查找(2)中的算法,只需要生成更小的存储空间O(M)
此处M表示模式字符串的长度
并且需要的next数组空间小,所以在生成匹配数组时,速度会更快
但是查找字符串时,相对字符串查找(2)的算法,它的最差时间复杂度为O(MN),其实比较差的。但是在实际表现中,每次需要查找不同的字符串都要重新生成匹配字符串,并且它通常只需要更少的内存,实际表现反而优于字符串查找(2)中的KMP查找算法
浙公网安备 33010602011771号