如何把一个用*号分割的字符串全排列(50分)

  • 主题发起人 主题发起人 冬月
  • 开始时间 开始时间

冬月

Unregistered / Unconfirmed
GUEST, unregistred user!
如何把一个用*号分割的字符串全排列,比如在edit中输入s*f*02,后在listbox中显示
s*f*02
s*02*f
f*s*02
f*02*s
02*f*s
02*s*f
 
思路参考:
先分割字符串为3个字符串,然后循环组合一下就可以排序输出了。
 

用TStringList分割字符串的方法。。。。。
var MS:TStringList;
MS:=TStringList.Create;
MyStrList.Delimiter:='*'
//指定分隔符
MyStrList.DelimitedText:='s*f*02';
这个时候就自动按照分割*分割成三个子串了

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2524302
 
读入数组也可以
 
procedure TForm1.Button1Click(Sender: TObject);
var Strs:TStringList;
I,Count,m,n,l:Integer;
Loops:Array of Integer;
Str:String;
begin
Strs:=TStringList.Create;
try
Strs.Delimiter:='*';
Strs.DelimitedText:=Edit1.Text;
Count:=Strs.Count;
SetLength(Loops,Count);
Memo1.Clear;n:=0;
for I:=0 to Count-1 do Loops:=I;
while true do
begin
Str:='';
for I:=0 to Count-1 do Str:=Str+'*'+Strs[Loops];
Str:=Copy(Str,2,Length(Str));
Memo1.Lines.Append(Str);
m:=-1;
for I:=Count-1 downto 1 do
if Loops>Loops[I-1] then begin m:=I-1
break
end;
if m=-1 then Break;
for I:=Count-1 downto m do
if Loops>Loops[m] then begin n:=I;break
end;
Loops[m]:=Loops[m]+Loops[n];Loops[n]:=Loops[m]-Loops[n];Loops[m]:=Loops[m]-Loops[n];
l:=(m+Count-1) Div 2;
for I:=1 to l-m do
begin
Loops[m+i]:=Loops[m+i]+Loops[Count-i];
Loops[Count-i]:=Loops[m+i]-Loops[Count-i];
Loops[m+i]:=Loops[m+i]-Loops[Count-i];
end;
end;
finally
Strs.Free;
end;
end;
 
在我的机子上,上铺的代码通不过,我的是5.X
我修改了一下
但是还有问题
var Strs:TStringList;
I,Count,m,n,l:Integer;
Loops:Array of Integer;
abc,Str:String;
begin
Strs:=TStringList.Create;
try
// Strs.Delimiter:='*';
abc:=Edit1.Text;
strs.text :=StringReplace(abc,'*',#13#10,[rfReplaceAll]);
Count:=Strs.Count;
SetLength(Loops,Count);
Memo1.Clear;n:=0;
for I:=0 to Count-1 do Loops:=I;
while true do
begin
Str:='';
for I:=0 to Count-1 do Str:=Str+'*'+Strs[Loops];
Str:=Copy(Str,2,Length(Str));
Memo1.Lines.Append(Str);
m:=-1;
for I:=Count-1 downto 1 do
if Loops>Loops[I-1] then begin m:=I-1
break
end;
if m=-1 then Break;
for I:=Count-1 downto m do
if Loops>Loops[m] then begin n:=I;break
end;
Loops[m]:=Loops[m]+Loops[n];Loops[n]:=Loops[m]-Loops[n];Loops[m]:=Loops[m]-Loops[n];
l:=(m+Count-1) Div 2;
for I:=1 to l-m do
begin
Loops[m+i]:=Loops[m+i]+Loops[Count-i];
Loops[Count-i]:=Loops[m+i]-Loops[Count-i];
Loops[m+i]:=Loops[m+i]-Loops[Count-i];
end;
end;
finally
Strs.Free;
end;
end;
 
http://www.lkinfo.net/t.rar
 
Strs.Delimiter:='*';
Strs.DelimitedText:=Edit1.Text

在5.X下,多通不过
 
//Strs.Delimiter:='*';
//Strs.DelimitedText:=Edit1.Text
//将Edit的内容放到Strings中,同时解析出多少个排序元素;
Strs.Text:=StringReplace(Edit1.Text,'*',#13#10,[rfReplaceAll]);


你重新下载http://www.lkinfo.net/t.rar
 
还没解决吗???
 
一个生成全排列的问题。查查《如何求解问题--现代启发式方法》。
 
如果你可以取得1,2,3的排列就可以解决这个问题了,具体的方法要用到递归.想想看吧
 
先分割放进一个数组,然后再排列出所有的排列。最简单的方法大概就是深度搜索(depth-first)了,用递归+循环。算法看看书
 
刘麻子,,TYZhang 两位大虾的帮助,能有效率再高一点的算法吗
 
接受答案了.
 
后退
顶部