不答也来看看啊..在线等....(50分)

  • 主题发起人 主题发起人 wutaoqing
  • 开始时间 开始时间
哪位大哥有更好的方法啊??
请拿出来大家共享下
 
my god ,今天面世的时候碰到这个问题了。我想了N久,没想出来。好在那公司我不想进,不然就完蛋了。
 
var
Form1 : TForm1;
aString : TStringList;

implementation

{$R *.dfm}

function TForm1.DealString(Str: String): TStrings;
var
i, j, k : integer;
n_Index : integer;
Str_Tmp : String;
StrList_Tmp : TStringList;
begin
ListBox1.Clear;
aString.Clear;
StrList_Tmp := TStringList.Create;
Result := TStringList.Create;
for k := 1 to Length(Str) do { 依次取单个字符}
begin
StrList_Tmp.Clear;
if aString.Count < 1 then
aString.Add(Str[k])
else
begin
Result.Clear;
Result.AddStrings(aString);
aString.Clear;
for i := 0 to Result.Count - 1 do
begin
for j := 1 to Length(Result.Strings) + 1 do {新取的字符Str[k]与 aString中的所有字符串进行组合}
begin
Str_Tmp := Result.Strings;
Insert(Str[k], Str_Tmp, j);
if not StrList_Tmp.Find(Str_Tmp, n_Index) then { 如果不重复,则加入aString中}
StrList_Tmp.Add(Str_Tmp);
end;
end;
end;
aString.AddStrings(StrList_Tmp);
end;
aString.Sort;
ListBox1.Items.AddStrings(aString);
Label1.Caption := IntToStr(ListBox1.Count) + ' 个字符串';
StrList_Tmp.Free;
Result.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
aString := TStringList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
aString.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Str : String;
begin
Str := Edit1.Text;
DealString(Str);
end;

昨天想出来的,试了一下可以,你看看吧
注:aString是一个全局TStringList变量,用来存储DealString()返回的字符串列表
思路:挨个取Edit1.text的单个字符进行排列组合,形成的字符串存到aString列表中,
例:Edit1.text := 'are'
取第一位:'a' -> aString : 'a'
取第二位:'r' -> aString : 'ar', 'ra'
......
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,strutils;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
function digui(slist1,slist2:tstrings):tstringlist;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
i,j:integer;
str1,str2:tstrings;
begin
str1:=tstringlist.Create;
str2:=tstringlist.Create;
s:=trim(edit1.Text);
memo1.Clear;
while length(s)<>0 do
begin
if (memo1.Lines.Count=0) then
memo1.Lines.Add(leftstr(s,1))
else if (memo1.Lines.IndexOf(leftstr(s,1))=-1) then
memo1.Lines.Add(leftstr(s,1));
delete(s,1,1);
end;
str1.AddStrings(memo1.Lines);
str2.Addstrings(memo1.Lines);

for i:=0 to str2.Count-2 do
str2.AddStrings(digui(str1,str2));


//showmessage(s);
memo2.Clear;
memo2.Lines.AddStrings(str2);
end;

function TForm1.digui(slist1,slist2:tstrings):tstringlist;
var i,j:integer;
slist:tstrings;
begin
slist:=tstringlist.Create;
result:=tstringlist.Create;
result.clear;
slist.Clear;
slist.AddStrings(slist2);
slist2.Clear;
for i:=0 to slist1.count-1 do
begin
for j:=0 to slist.Count-1 do
begin
//showmessage(inttostr(pos(slist1,slist[j])));
if (slist.Count=1) then
result.Add(slist[j])
else if pos(slist1,slist[j])=0 then
result.Add(slist1+slist[j]);
end;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
memo2.ScrollBars:=ssboth;
end;
end.

无聊加郁闷的情况下总算才写出来这个递规,看来我这辈子碰到递规就要走人了.

edit 里输入任意字符,当然可以随便重复, memo1 其实只是个中介作用,用来把字符分出来,
memo2 用来显示各种组合. 大概测试了下,不知道有无问题.

其实一个简单的递规,当初递规考虑的方向错了,唉 害的面试的时候没做出来.
 
后退
顶部