数字组合的问题,求一算法,急用! ( 积分: 100 )

  • 主题发起人 主题发起人 anchony
  • 开始时间 开始时间
A

anchony

Unregistered / Unconfirmed
GUEST, unregistred user!
str='4,3,5,1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,6,4,2,2' 22个字符
我想把其中的6个组成一串,不能产生重复的字符串,产生的结果如下:
4,3,5,1,1,1,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
4,*,5,1,1,1,1,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
4,*,*,1,1,1,1,2,*,*,*,*,*,*,*,*,*,*,*,*,*,*
。。。。。。。。。
*,3,5,1,1,1,1,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
*,3,*,1,1,1,1,2,*,*,*,*,*,*,*,*,*,*,*,*,*,*
。。。。。。。。
*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,4,5,6,4,2,2


要求最精简的算法,速度越快越好.非常感谢大富翁的兄弟们!
 
看不明白。
 
PROCEDURE TForm1.Button1Click(Sender: TObject);
CONST
v = '4351111222233344456422';
VAR
i, j, vcount : integer;
pw : Tstrings;
BEGIN
//这是用了后5位连续的方法,如果是不连续那就是22*21*20*19*18*17这么多了
pw := Tstringlist.Create;
//第一位最大只能到长度-6位
vcount := length(v)-6;
WITH pw DO
FOR i := 0 TO vcount DO
FOR j := 1 TO vcount+2 DO
Add(v + copy(v, j, 5));
memo1.Lines.AddStrings(pw);
END;
 
procedure TForm1.Button1Click(Sender: TObject);
var
numindex: array [0..4] of Integer;
v1,v2: TStringList;
len: Integer;
offset, offset_in: Integer;
value: string;
I: Integer;
begin

for I := Low(numindex) to High(numindex) do
begin
numindex := I + 1;
end;

v1 := TStringList.Create;
v2 := TStringList.Create;
v1.Delimiter := ',';
v2.Delimiter := ',';
v2.DelimitedText := '*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*';
v1.DelimitedText := '4,3,5,1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,6,4,2,2';
len := v1.Count;

Memo1.Clear;

offset := 0;
offset_in := 0;

while (numindex[Low(numindex)] + High(numindex) + offset + offset_in < len) do
begin
while (numindex[High(numindex)] + offset + offset_in < len) do
begin
v2.Strings[offset] := v1.Strings[offset];

for I := Low(numindex) to High(numindex) do
begin
v2.Strings[numindex + offset + offset_in] := v1.Strings[numindex + offset + offset_in];
end;
value := v2.DelimitedText;

Memo1.Lines.Add(value);

v2.Clear;
v2.DelimitedText := '*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*';
Inc(offset_in);
end;
offset_in := 0;
Inc(offset);
Memo1.Lines.Add('');
end;

v1.Free;
v2.Free;
end;
 
Delphi程序员 QQ 群 39660298
 
后退
顶部