能否给我一个匹配子字符串的算法提示(50分)

  • 主题发起人 主题发起人 Solid_Snake
  • 开始时间 开始时间
S

Solid_Snake

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:a123bc和123,于是能找到,并且返回第一次出现123的位置,我不想使用pos函数,想自己写一下,能帮我一下吗,如何处理?
 
并不复杂,但可能算法烦一点,用一个标识,一个循环,一个整数。
从字符串第一个字符开始比较,如果找到一个字符和子串的第一个字符相同,则将
标识设成真,再接下去比较,如果中间出现了不同,则将标识成假。如是到结束。
大至如下
function pos(s1,s2:string):integer;
var bFind:boolean
i,j:integer;
begin
j:=1
bFind:=False;
for i:=1 to length(s2) do
begin
if j<=Length(s1) then
if s1=s2[j] then
begin
if j=1 then result:=i

inc(j);bFind:=true

end
else begin j:=1
bFind:=false result:=0 ;end;
end
else
Result:=0;
end;
end;
写得比较急,可以自己改一下
 
var
ss,si: string;
i,j,a:integer;
begin
a:=0

ss:='a1234b';
si:='1234';
for i:=0 to length(ss)-1 do
begin
for j:=0 to length(si)-1 do
begin
if (ss[i+j]<>si[j]) then break
else
if j=(length(si)-1) then //如果j已于长度减1相等,说明已经比较完si了
a:=i
//将ss中开始位置i赋值给a
end;
end;
Edit1.Text := inttostr(a);
end;

end.

这是我的程序,但是a总是返回0,我想哪里错了,但是又不知道错在那里,能不能帮我改一下啊,谢谢了。。。。。。。。。。。。。。。。。。。。。
 
function mypos(s1,s2:string):integer;
var
i:integer;
begin
Result:=0;
for i:=1 to length(s2) do
if s1[1]=s2 then
if s1=copy(s2,i,length(s1)) then
begin
Result:=i;
break;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(mypos('123','a1234b')));
end;
 
楼主,你的程序在第二个for的时候,i为0,j为0,ss[i+j]为'a',si[j])为'1',for就中断了,还有你应该用KMP算法,那是世界上目前最快的子字符串比较算法,只要一个for就够了!!在n长的字符串里匹配m长的子字符串,时间复杂度只要n!!!!
 
我想你去看一下程序员那本书的字符模式匹配KMP就知道怎么办了
 
还有,我请问一下,字符串的0索引处是一个标志位,不能用来循环的,这个标志位是怎抹回事???
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
D
回复
0
查看
928
DelphiTeacher的专栏
D
D
回复
0
查看
882
DelphiTeacher的专栏
D
D
回复
0
查看
855
DelphiTeacher的专栏
D
后退
顶部