我有以前未知数量的单词,为了方便起见,将其存储在 TStringList 对象中。
var
input_list: TStringList;
begin
input_list := TStringList.Create;
input_list.Add('Mark');
input_list.Add('Anna');
input_list.Add('John');
input_list.Add('Martha');
...
end;
我想创建一个新列表,其中包含这些单词的所有可能组合,从 1 个单词到 N 个单词。分隔符无关紧要:
N = 3
'Mark'
'Anna
'Mark Anna'
'Anna Mark'
'Mark John'
'John Mark'
'Mark Anna John'
'John Anna Mark'
'Anna John Mark'
...
请注意,上面的示例包含上述单词列表中 1 到 N 个单词的组合。此外,我认为相同的单词但顺序不同是不同的,所以“mark anna”和“anna mark”都应该在列表中。
编辑:另请注意,这些组合不重复,即“mark anna”应包含在列表中,但“mark mark”不应包含在列表中。
有没有一种简单的方法,例如 procedure_permutate(list_of_strings)?
您可以使用递归函数,例如;
procedure TForm1.generarCombinaciones(const elementos: TStringList;
const combinacion: string; inicio: Integer);
var
i: Integer;
begin
if combinacion <> '' then
ShowMessage(combinacion);
for i := inicio to elementos.Count-1 do
GenerarCombinaciones(elementos, combinacion + elementos.Strings[i] + ' ', i + 1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
sl : TStringList;
begin
sl := TStringList.Create;
sl.Add('Mark');
sl.Add('Anna');
sl.Add('John');
sl.Add('Martha');
generarCombinaciones(sl,'',0);
sl.free;
end;