Как совершенно другой ответ от моего другого ответа ...
Вы можете, с одним проходом, ковш каждой строки на основе первой букве.
С помощью другого прохода вы можете отсортировать каждое ведро на основании его второго позже. (Это известно как поразрядная сортировка, который O(n*m)
и O(n)
с каждым проходом.) Это дает базовый префикс 2.
Вы можете безопасно удалить из набора данных каких-либо элементы, которые не имеют префикса 2.
Вы можете продолжить сортировку радикса, удалив элементы без общего префикса p
, так как p
подходит к m
.
Это даст вам то же самое время, что и при использовании trie, но всегда будет быстрее, чем trie, поскольку trie должен смотреть на каждый символ в каждой строке (поскольку он входит в структуру), в то время как этот подход гарантированно смотреть на 2 символа на строку, и в этот момент она отбирает большую часть набора данных.
Худший случай - все равно, что каждая строка идентична, поэтому она имеет одинаковую большую нотацию O, но будет быстрее во всех случаях, так как гарантировано использовать меньшее количество сравнений, поскольку в любом «не худшем случае», есть персонажи, которые никогда не нужно посещать.
@Mark Я считаю, что этот пример будет 'flow' , Судя по контексту предлагаемого решения, он должен быть общим только по крайней мере 2, а не для всех. Я согласен с некоторыми разъяснениями от ОП. – corsiKa
строка может начинаться без 'fl'. 'hello' был поставлен, чтобы доказать, что это могут быть любые строки, в которых в одной строке не должно быть общего префикса с остальными – shreyasva