Как найти самый длинный префикс палиндрома строки в O (n)?Самый длинный префикс палиндрома
ответ
решения для более общей проблемы, а не префикс, но подстрока, в О (п):
http://www.akalin.cx/2007/11/28/finding-the-longest-palindromic-substring-in-linear-time/
Второй результат на Google для "длинной палиндромности префикса" ....
Или решение с помощью суффиксов деревьев:
Имеет функцию 'fastLongestPalindromes (..)' по ссылке на akalin.cx на самом деле 'O (n)' наихудшая сложность случая? Я вижу две вложенные петли. –
Не читал все, кроме 2 вложенных циклов, это не означает квадратичную сложность. Продолжение в начале функции должно гарантировать, что внутренний цикл выполняется только в нескольких случаях и что общая сложность каждого выполнения этого цикла равна O (n). –
Используйте rolling hash. Если a
ваша строка, пусть ha[x]
быть хэш-первых x
символов в a
вычисленных слева направо, и пусть hr[x]
быть хэш-первых x
символов в s
вычисленных справа налево. Вас интересует последняя позиция i
, для которой hf[i] = hb[i]
.
код в C (используйте два хэши для каждого направления, чтобы избежать ложных срабатываний):
int match = n - 1;
int ha1 = 0, ha2 = 0, hr1 = 0, hr2 = 0;
int m1 = 1, m2 = 1;
for (int i = 0; a[i]; ++i)
{
ha1 = (ha1 + m1*a[i]) % mod1;
ha2 = (ha2 + m2*a[i]) % mod2;
hr1 = (a[i] + base1*hr1) % mod1;
hr2 = (a[i] + base2*hr2) % mod2;
m1 *= base1, m1 %= mod1;
m2 *= base2, m2 %= mod2;
if (ha1 == hr1 && ha2 == hr2)
match = i;
}
Я думаю, что часть «справа налево» отсутствует в примере кода ... ('i' идет слева направо, и вы получаете доступ только к' a [i] '. –
@Andre Holzner -' i' идет только слева направо. На каждом шаге 'i' вы будете иметь длину текущего самого длинного палиндромного префикса, хранящегося в' match'. Только катящиеся хеши идут в обоих направлениях. – IVlad
+1, Знаю, что это называлось «катящимся хешем». Но я даже два хэша не гарантирует, что каждое положительное значение «истинно» (не говоря уже о таких необычных коэффициентах :)). Просто потому, что для некоторой длины _n_ существует больше n-символьных строк, чем разные пары чисел int _ (ha1, ha2) _. И если вы проверите каждое положительное число, вы получите O (n^2) на равномерной строке ('aaaaaaaa ...'). –
- 1. длинный префикс палиндрома комплектующие
- 2. Самый длинный общий префикс Array
- 3. Trie самый длинный префикс соответствия
- 4. Самый длинный общий суффикс-префикс
- 5. Найти самый длинный префикс String
- 6. Самый длинный префикс массива, равный значению
- 7. Самый длинный общий префикс для n строки
- 8. Самый длинный общий префикс в Haskell
- 9. Нужно проверить самый длинный префикс числа
- 10. найти самый длинный префикс, содержащийся в словаре
- 11. сети: длинный префикс сопоставления
- 12. Самый большой продукт палиндрома
- 13. Алгоритм/шаги, чтобы найти самый длинный префикс в Patricia Trie
- 14. Perl - самый длинный общий префикс из 2 или более строк?
- 15. Как удалить самый длинный префикс, который появляется в массиве?
- 16. Найти самый длинный префикс, который соответствует определенному условию в scala
- 17. Regexp находит самый длинный общий префикс двух строк
- 18. Самый длинный палиндром в строке
- 19. Самый большой алгоритм палиндрома - JS
- 20. Самый длинный общий подсписок
- 21. Самый длинный вспомогательный массив
- 22. Самый длинный алгоритм подсети
- 23. Ocaml: Самый длинный путь
- 24. Самый длинный путь графика
- 25. Самый длинный простой путь
- 26. , которые компиляторы дают самый длинный длинный двойной
- 27. самый большой продукт палиндрома в java
- 28. Найти следующий самый большой номер палиндрома
- 29. выбран самый длинный и самый короткий кривые
- 30. Нарушает ли это самый «самый длинный» принцип?
Это звучит как домашнее задание вопрос. Если это так, он должен быть помечен как таковой. –
Определите самый длинный префикс палиндрома. А должно ли время быть связано O (n) или памятью? И это домашнее задание? –
Я думаю, что этот ответ является toyota –