Самый простой способ генерировать все возможные панграмы из списка слов вероятно, для создания всех возможных комбинаций слов из списка, затем для каждого из них, проверьте, является ли это панграмой. Чтобы выполнить проверку, пройдите по строке и установите bool в true для каждой буквы, которая находится в строке. В конце концов, это pangram, если у bools установлено значение true.
Более эффективный метод, вероятно, состоял бы в том, чтобы пройти каждое слово и настроить массив bools (или набор битов, например, в 32-битном int), а также длину слова. Затем вы можете найти биты, которые или вместе создают значение со всеми установленными 26 битами, и у вас есть pangram.
Как вы добавляете pangram вместе, вы можете добавить проверку границ, так что, если добавление слова сделает потенциальную pangram дольше, чем ваша самая короткая pangram (если таковая имеется), вы остановите эту проверку прямо там. Если вы начнете с сортировки своих слов по длине, то в минуту, когда вы нажмете более длинную комбинацию, вы можете выйти из этого целого множества попыток и перейти к следующей возможности.
Если вы хотите получить еще более утонченный об этом, вы можете начать с создания такого же бита, как указано выше. Затем возьмите их и соедините бит, чтобы определить, какие буквы встречаются в наименьших словах. Когда вы начинаете генерировать потенциальную панграму, вы знаете ее должно включить одно из этих слов. Например. в списке, который вы указали выше, «ленивый», «ленивый» и «сумасшедший», по-видимому, являются единственными, которые включают «z», поэтому вы сразу же знаете, что каждый pangram должен включать одно из этих трех слов. Ни один из них не включает в себя «q», и единственные слова, которые включают «q», кажутся «быстрыми» и «самыми быстрыми», поэтому (снова) каждый панграм должен включать один из этих двух (конечно, я собираюсь от ручного осмотра здесь, поэтому я, возможно, пропустил слово). Итак, все возможные панграмы из этого списка включают (и могут также начинаться): (быстрый | самый быстрый) (ленивый | ленивый | сумасшедший).
Вы также можете рассмотреть возможность предварительной обработки списка слов: любое слово, которое длиннее другого, но не содержит хотя бы одной буквы, отсутствующей в другой, может быть немедленно устранено. В качестве гипотетического примера, если у вас есть «ab» и «abab», вы знаете, что «abab» никогда не может привести к более коротким панграмм, чем «ab», поэтому вы можете сразу же исключить его из списка.
Не задана ли проблема с крышкой? http://en.wikipedia.org/wiki/Set_cover – Drakosha
Вы ищете хорошие аппроксимации или абсолютные минимумы? Проблема нахождения оптимального ответа, вероятно, NP-полная. http://en.wikipedia.org/wiki/NP-complete – luke
NP-полнота не означает не выполнимо. Это просто займет время. :) – kurast