(aa,567)(好不好,777)(3日2日,222)(4热4热,5t4t4)(6u6u,ggg)(t4t4,eee)............
有一个不定长度的字符串,有N个括弧,每对括弧里面是2个元素,要求取出8个元素的排列组合,括弧对数大于8的。比如取出 aa*777*3日2日*5t4t4*ggg*eee..............,这样的组合,没对括弧里每次只能取一个元素。

解决方案 »

  1.   

    这段代码报OUT OF memory 错误,请教大家procedure TForm1.getn(ss, ss1: string; count: Integer; var str: TStrings);
    var
      i,j,m,n:Integer;
      s,s1,s2,s3:string;
      str1,str2:TStrings;
    begin
      str1:=TStringList.Create;
      str1.Clear;
      str2:=TStringList.Create;
      str2.Clear;
      ExtractStrings(['*'],[],PChar(ss),str1);
      i:=str1.Count;
      if i=0 then
        Exit;
      for j:=1 to i do
      begin
        s1:=str1.Strings[j-1];
        if ss1='' then
          s3:=ss1+s1
        else
          s3:=ss1+'*'+s1;
        str2.Clear;
        ExtractStrings(['*'],[],PChar(s3),str2);
        if str2.Count=count then
        begin
          str.Add(s3);
          Continue;
        end;
        s2:='';
        for n:=j to i-1 do
          s2:=s2+str1.Strings[n]+'*';
        Self.getn(s2,s3,count,str);
      end;  str1.Free;
      str2.Free;
    end;
      

  2.   

    取8个元素的组合结果太多了,取4个元素组合的代码如下:
    ...
    var
      A1:array[1..5,1..4] of Integer=
        (
          (1, 2, 3, 4),
          (1, 2, 3, 5),
          (1, 2, 4, 5),
          (1, 3, 4, 5),
          (2, 3, 4, 5)
        );
      A2:array[1..5,1..2] of string=
        (
          ('aa','567'),('好不好','777'),('3日2日','222'),('4热4热','5t4t4'),('6u6u','ggg')
        );
      A3:array[1..16,1..4] of Integer=
        (
          (1,3,5,7),(1,3,5,8),(1,3,6,7),(1,3,6,8),(1,4,5,7),(1,4,5,8),(1,4,6,7),(1,4,6,8),
          (2,3,5,7),(2,3,5,8),(2,3,6,7),(2,3,6,8),(2,4,5,7),(2,4,5,8),(2,4,6,7),(2,4,6,8)
        );
      A4:array[1..8] of string;procedure TForm1.Button2Click(Sender: TObject);
    var
      i,k,m:Integer;  procedure OutM;
      var
        i,j:Integer;
        s:string;
      begin
        for i:=1 to 16 do
        begin
          s:='';
          for j:=1 to 4 do
          begin
            if s<>'' then s:=s+'*';
            s:=s+(A4[A3[i][j]]);
          end;      Memo1.Lines.Add(s);
        end;
      end;begin
      Memo1.Clear;  for i:=Low(A1) to High(A1) do
      begin
        FillChar(A4,8*sizeof(Integer),0);    for m:=1 to 4 do
        begin
          k:=A1[i][m];
          A4[m*2-1]:=A2[k,1];
          A4[m*2]:=A2[k,2];
        end;    OutM;
      end;
    end;
      

  3.   

    要求取出8个元素的排列组合,括弧对数大于8的。比如取出 aa*777*3日2日*5t4t4*ggg*eee
    eee*ggg*5t4t4*3日2日*777*aa 这样的得不得输出?
      

  4.   

    “每对括弧里面是2个元素”可以看成是一个二进制位,n对括弧就是n位二进制数,比如8对做排列组合就是:
    for i := 0 to 255 do
      for j := 0 to 7 do
        begin
          判断i的第j位,是0就输出第j对括弧里面的第一个元素,1则输出第二个,反之也可以
        end;