А как выписать набор вручную? Можно построить дерево вариантов, использующее связь типа Q -> QE -> QEW. Сначала выбираем элемент и наращиваем на него не использовавшийся символ, т.е. который не присутствует как в обрастающем элементе, так и на данном этапе обрастания. Т.е, берем Q, выбираем W (Q не подходит по условию). Идем дальше. Снова берем Q, W противоречит условию, остается E.
Нечто подобное:
Код:
var
i, j, k, l, VarLength, CurVar: integer;
Str, Sym: string;
Used, Current: string;
Output: array of string;
Again: boolean;
begin
Str := Edit1.Text;
Current := ''; // комбинация из дерева, обрастающая буквами
CurVar := 0; //номер элемента массива всех комбинаций, соответсвующий Current
VarLength := 0; //длина Current
SetLength(Output, 1);
l := 1;
while (Length(Str) - VarLength) > 0 do
begin
Used := Current; //символы, которые есть в обрастающей, использовать нельзя
for i := 1 to (Length(Str) - VarLength) do
begin
k := 1;
repeat //выбираем не использовавшийся символ
Again := false;
j := 1;
Sym := Str[k];
while (j <= Length(Used)) and (Again = false) do //проверка
begin
if Sym = Used[j] then Again := true;
j := j + 1;
end;
k := k + 1;
until (Again = false) or (k > Length(Str));
Output[Length(Output)-1] := Current + Sym;
Used := Used + Sym; //пополняем строку использованных символов
ShowMessage(Output[Length(Output)-1]);
SetLength(Output, Length(Output) + 1);
end;
Current := Output[CurVar]; // если комбинация обрасла по-всякому, ставим новую
CurVar := CurVar + 1;
VarLength := Length(Current);
l := l + 1;
end;
end;