我想用KMP算法實現strstr。這是維基百科中給出的算法。 KMP算法的時間複雜度爲O(n),其中n是較大字符串的大小。KMP算法的時間複雜度
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)嗎?
你認爲這會是什麼,並解釋? – herohuyongtao
我認爲填充數組T是O(m^2),第二部分是O(n * m),其中m是較小字符串的大小。 – Crusher
這可能有助於:[wiki:KMP](http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm)。 – herohuyongtao