Поиск "сцепленных" слов

Поиск пар слов, у которых окончание первого слова совпадает с началом второго слова. Пользователь задает длины этих слов, количество совпадающих букв, а также указывает известные буквы в запросе. Вместо неизвестной буквы подставляется символ ?, совпадающие буквы записываются внутри круглых скобок.

Например: ????(нин)??? = армя(нин)дзя, армянин и ниндзя.

Пользователь может указать, должна ли каждая из трех частей запроса быть осмысленным словом (то есть должны ли буквы этой части запроса составлять слово из базы данных программы). Например, в случае с запросом вида т???(?а?)???н в ответе тюль(пан)сион все три части ответа являются осмысленными словами. Также, осмысленным словом может являться и весь запрос целиком.