【发布时间】:2014-02-09 05:04:49
【问题描述】:
我正在尝试使用 KMP 算法实现 strstr。这是维基百科中给出的算法。 KMP算法的时间复杂度为O(n),其中n是较大字符串的大小。
vector<int> KMP(string S, string K)
{
vector<int> T(K.size() + 1, -1);
vector<int> matches;
if(K.size() == 0)
{
matches.push_back(0);
return matches;
}
for(int i = 1; i <= K.size(); i++)
{
int pos = T[i - 1];
while(pos != -1 && K[pos] != K[i - 1]) pos = T[pos];
T[i] = pos + 1;
}
int sp = 0;
int kp = 0;
while(sp < S.size())
{
while(kp != -1 && (kp == K.size() || K[kp] != S[sp])) kp = T[kp];
kp++;
sp++;
if(kp == K.size()) matches.push_back(sp - K.size());
}
return matches;
}
我不明白这个算法的复杂度是 O(n)。谁能解释一下这段代码的复杂度是 O(n) 吗?
【问题讨论】:
-
你认为这还会是什么并解释一下?
-
我认为填充数组 T 是 O(m^2),第二部分是 O(n*m),其中 m 是较小字符串的大小。
-
这可能会有所帮助:wiki: KMP.
标签: c++ string algorithm time-complexity