![]() |
|||
Алгоритм Кнута-Морриса-ПраттаПусть даны некоторые строки Для начала нужно найти символ
![]() Таким образом, за один проход по массиву
![]() Реализация алгоритма на языке С++: std::string s = s2 + X + s1;
std::vector<int> pf(s.size() + 1, 0);
for (int i = 2; i < (int)pf.size(); i++) {
int prefLen = pf[i - 1];
while (true) {
if (s[i - 1] == s[prefLen]) {
pf[i] = prefLen + 1;
break;
} else if (prefLen == 0) {
break;
}
prefLen = pf[prefLen];
}
}
std::vector<int> positionsOfs2;
for (int i = 0; i < pf.size(); i++) {
if (pf[i] == s2.length()) {
positionsOfs2.push_back(i - 2 * s2.length() - 1);
}
}
Сложность алгоритма составляет ![]() ![]() |
|||
|
|||
|