2013-03-31 8 views
12

Для примера String A = "abcd" тогда ответ должен быть {a, ab, abc, abcd, b, bc, bcd, c, cd, d} (я не знаю, все называют подстроки или нет, но я предполагаю, что так ...)Найти все возможные подстроки самым быстрым способом

чтобы найти все подстроки я использовал следующий метод

for (int i = 0; i < A.length(); i++) { 
     for (int j = i+1; j <= A.length(); j++) { 
      System.out.println(A.substring(i,j)); 
     } 
    } 

но, по моему пониманию он идет к N^2 мы можем сделать это быстрее, я ссылался на пронизывающий вопрос и была ссылка на суффикс-дерево http://allisons.org/ll/AlgDS/Tree/Suffix/, но он, похоже, не решает мою проблему .... вывод, который я получаю из дерева суффикса: {1: abcd 2: bcd 3: cd 4: d} Может ли кто-нибудь помочь мне найти самый быстрый способ сделать это? что-то вроде в линейном времени? Спасибо заранее .....

+0

Вы не можете сделать это быстрее, чем O (n^2), чтобы даже указать начальную и конечную точки каждой возможной подстроки, так как существуют O (n^2) такие подстроки! Если вы хотите распечатать каждую подстроку в полном объеме (как вы сейчас делаете), тогда временная сложность переходит к O (n^3), поскольку для печати каждой подстроки требуется время, пропорциональное общей длине строки. –

+0

Также обратите внимание, что пустая строка также является допустимой подстрокой. – Philip

+2

Вы можете сделать это быстрее, если вы собираетесь запускать запрос по множеству подстрок, которые не «касаются» их всех. Их печать затрагивает все. Если вы хотите спросить, скажем, «какая самая длинная подстрока, которая появляется по крайней мере дважды» или «какая подстрока более чем k символов встречается наиболее часто», то вы можете сделать это без перечисления всех подстрок (с деревом суффиксов). – harold

ответ

19

Вы не можете создавать строки O(N^2) лучше, чем O(N^2) раз. Это математическая невозможность. Даже если создание строки заняло одну команду, это все равно вычисление O(N^2).

Я не думаю, что ваш код может быть улучшен каким-либо значительным образом.


я должен заметить, что этот код оптимизации является бесполезной деятельности, так как фактические результаты будет доминировать оверхэдах написания символов в выходной поток ... и все, что делает ОС с выходом поток.

+0

Красиво объяснено, надеюсь, что здесь будет зафиксирована логика , – kabuto178

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