如何对多个字符串进行所有可能的组合

问题描述 投票:0回答:1

我有以前未知数量的单词,为了方便起见,将其存储在 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)?

delphi
1个回答
0
投票

您可以使用递归函数,例如;

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;
© www.soinside.com 2019 - 2024. All rights reserved.