Реальный ответ на вашу проблему, я думаю, заключается в использовании префиксного дерева. Алгоритм принятых ответов выполнит эту работу, но вам придется проверять свое префиксное слово перед каждым другим в вашем наборе слов, которое является линейным по времени. Сделайте это для всех слов (скажем, вы хотите получить все слова, которые являются префиксами других слов), и у вас будет сложность O (n ^ 2).
Простая проверка, является ли слово префиксом другого, линейна по длине слова.
Использование префикса дерева ответит на ваш первый вопрос в логарифмическом времени, а второй - в линейном. Проверка того, является ли слово префиксом, - это просто прогулка вниз от корня вверх, пока вы не найдете слово в дереве, а последний узел не является листом (то есть существует более длинное слово, расширяющее его) - ограниченный высотой дерева. С другой стороны, обход дерева и запись текущего слова на каждом шаге, для которого последний узел не является листом, дает список всех префиксных слов. Обход дерева осуществляется за линейное время, так как вы посещаете каждый узел только один раз.