Найти все возможные подстроки самым быстрым способом

Для строки 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));
    }
}

Но, насколько я понимаю, сложность связана с O(N^2). Можем ли мы сделать это быстрее? Я сослался на предыдущий вопрос, и была ссылка на дерево суффиксов, но это, похоже, не решило мою проблему. Вывод, который я получаю из дерева суффиксов, это

{
 1: abcd
 2: bcd
 3: cd
 4: d
} 

Может ли кто-нибудь помочь мне найти самый быстрый способ сделать это? Что-то вроде линейного времени?

Ответ 1

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

Оставляя сложность в стороне, я не думаю, что ваш код может быть улучшен каким-либо существенным способом.


Можем ли мы сделать это быстрее?

Вероятно, нет.

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