具体代码如下:好像速度有点慢var i,j,m,cou,n:Integer; s,s1,str:string; str1,str2:TStringList; begin s:=self.Edit1.Text; i:=Length(s); if i=0 then Exit; m:=1; for j:=i downto 1 do m:=m*j; cou:=0; str1:=TStringList.Create; str2:=TStringList.Create; str1.Clear; Str2.Clear; str:=''; while cou<m do begin while str2.Count<i do begin Randomize; n:=Random(i); if str2.IndexOf(IntToStr(n))=-1 then begin str2.Add(IntToStr(n)); s1:=s[n+1]; str:=str+s1; end; end; str1.Add(str); str2.Clear; str:=''; cou:=cou+1; end; self.ListBox1.Items:=str1; end;
const num=4; str:array[1..4] of string=('fu','c','k3y','e');//分拆很容易,假设已经拆成这样了 var bstr:array[1..10] of boolean; resultstr:Tstringlist;{$R *.dfm}procedure zhuhe(n:integer;s:string); var i:integer; begin if n=0 then begin resultstr.Add(s); exit; end; for i:=1 to num do if bstr[i] then begin bstr[i]:=false; zhuhe(n-1,s+str[i]); bstr[i]:=true; end; end; procedure TForm1.Button1Click(Sender: TObject);begin resultstr:=Tstringlist.Create ; fillchar(bstr,sizeof(bstr),true); zhuhe(num,''); memo1.Lines.Add(resultstr.Text); end;
通过n得出可能出现的排列组合数m然后通过random(n-1),随机得出抽取位置,从固定字符串中抽取此位置上的字符,如果此位置已经得到,重新随机获取位置,直到获取次数等于n,可以组成一个随机字符串,判断TStringLIst中是否有相同的字符串,没有将其添加到TStringList中如果TstringList的count等于m,获取完成,否则继续
m:=1;
for k:=n downto 1 do
m:=m*n
i,j,m,cou,n:Integer;
s,s1,str:string;
str1,str2:TStringList;
begin
s:=self.Edit1.Text;
i:=Length(s);
if i=0 then
Exit;
m:=1;
for j:=i downto 1 do
m:=m*j;
cou:=0;
str1:=TStringList.Create;
str2:=TStringList.Create;
str1.Clear;
Str2.Clear;
str:='';
while cou<m do
begin
while str2.Count<i do
begin
Randomize;
n:=Random(i);
if str2.IndexOf(IntToStr(n))=-1 then
begin
str2.Add(IntToStr(n));
s1:=s[n+1];
str:=str+s1;
end;
end;
str1.Add(str);
str2.Clear;
str:='';
cou:=cou+1;
end;
self.ListBox1.Items:=str1;
end;
num=4;
str:array[1..4] of string=('fu','c','k3y','e');//分拆很容易,假设已经拆成这样了
var
bstr:array[1..10] of boolean;
resultstr:Tstringlist;{$R *.dfm}procedure zhuhe(n:integer;s:string);
var i:integer;
begin
if n=0 then
begin
resultstr.Add(s);
exit;
end;
for i:=1 to num do
if bstr[i] then
begin
bstr[i]:=false;
zhuhe(n-1,s+str[i]);
bstr[i]:=true; end;
end;
procedure TForm1.Button1Click(Sender: TObject);begin
resultstr:=Tstringlist.Create ;
fillchar(bstr,sizeof(bstr),true);
zhuhe(num,'');
memo1.Lines.Add(resultstr.Text);
end;
也感谢lovelymelon的热心回答,结贴~