2011-12-15 1 views
4

Для двух строк A и B мы определяем сходство строк как длину самого длинного префикса, общего для обеих строк. Например, сходство строк «abc» и «abd» равно 2, а сходство строк «aaa» и «aaab» равно 3.Обработка строк: вычисление «подобия строки с ее суффиксами»

Задача состоит в том, чтобы дать алгоритм вычисления суммы сходств строка S с каждым из ее суффиксов. Например, пусть строка будет: ababaa. Затем суффиксами строки являются ababaa, babaa, abaa, baa, aa и a. Сходство каждой из этих строк со строкой ababaa составляет 6,0,3,0,1,1, соответственно. Таким образом, ответ 6 + 0 + 3 + 0 + 1 + 1 = 11.

+3

Так вы пытались его решить? Где вы застряли? Какую помощь вы ищете? – bobbymcr

+0

Реализация алгоритма Укконена для построения дерева префикса в O (n) https://gist.github.com/3355993 – bicepjai

+0

Алгоритм Ukkonen предназначен для построения дерева * суффикса *, что, разумеется, является именно тем, о чем идет речь. Дерево суффикса не совсем то же самое, что и суффиксный массив, хотя они, очевидно, связаны между собой. – tripleee

ответ

8

Вы хотите рассмотреть suffix arrays. Суффикс-массив слова - это массив индексов суффиксов, отсортированных в лексикографическом порядке. В связанной статье wikipedia алгоритмы вычисляют LCP (самый длинный общий префикс), когда они вычисляют массив суффикса. Вы можете вычислить это значение в O(n) с использованием сходства с suffix trees, как показано в this paper.

Пример: Ваша строка ababaa, поэтому массив суффиксов выглядит следующим образом:

5 | a 
4 | aa 
2 | abaa 
0 | ababaa 
3 | baa 
1 | babaa 

где число слева является индексом, при котором начинается суффикс. Теперь довольно красиво вычислять префиксы, поскольку все хранится лексикографически.

В качестве побочного примечания это тесно связано с проблемой longest common substring. Чтобы практиковать для своего следующего интервью, подумайте о том, как эффективно это решать.

+0

: Большое спасибо за это! Я понимаю, что вы говорите, но я вообще не знаком с суффиксными деревьями, и, учитывая ограниченное количество времени, я хотел спросить вас, если вы можете посмотреть на Кнута Морриса, прат алготихм поможет –

+0

@PengOne: я пробовал но дерево слева, то есть LCP находится между str [i - 1] и str [i], то, что они ищут, находится между «ababaa» и «a», «ababa» и «aa», ababaa "и" abaa "и т. д., где мое решение не удается, потому что я делаю линейное сравнение, есть ли еще подсказка. – Avinash

+1

@PengOne Не могли бы вы объяснить, как решить эту конкретную проблему, используя массивы суффикса? Или какое преимущество дает лексикографическое упорядочение для решения по сравнению с ручным сравнением каждого суффикса с исходной строкой. –

Смежные вопросы