Если вам не разрешено выполнять какую-либо предварительную обработку этого списка строк, тогда нет «достаточно эффективного решения»: вам придется выполнять итерации по всему списку, проверяя каждое слово, может ли оно составляется по мере необходимости (т. е. его подпись, см. ниже, равномерно меньше, чем подпись входящей связки). O (N) для N строк в списке.
Если разрешена предварительная обработка (вы предварительно обрабатываете список один раз, а затем отвечаете на несколько запросов, достаточных для амортизации затрат на предварительную обработку), а затем для каждого слова в списке создайте «подпись», которая представляет собой массив из 26 целых чисел, подсчитывающих вхождения каждой буквы в строке (при условии, что это английский и без учета регистра - расширения очевидны). По ходу дела постройте карту от каждой подписи до списка слов, имеющих эту подпись. Эта предварительная обработка примерно равна O (N) для HashMap.
Теперь, учитывая группу из K букв, вы можете вычислить подпись группы и просмотреть каждый список слов с этой подписью на карте; повторить для всех сигнатур без равномерного распределения (O (2 ^ K) здесь верхняя граница). Так что для Z таких поисков вы платите O (N + Z * 2 ^ K) (против O (Z * N) без предварительной обработки), поэтому вы получаете (для достаточно больших чисел, чтобы оценки O () имели смысл), если N> 2 ^ К.