关于文本文件中字符串问题! ( 积分: 200 )

  • 主题发起人 主题发起人 failam
  • 开始时间 开始时间
F

failam

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个多行的文本文件中计算一个字符串出现的次数

望指教!谢谢!
 
一个比较简单的方法是:
从头开始查找该字符串,找到后计数器加一,然后继续从字符串后面的位置查找;如果没有找到就结束
 
从第一行到最后一行循环查找 用pos函数,找到有一个就INC(count)
 
是不是动态的
如果是在 memo中 有这样一段代码
procedure TForm1.Button1Click(Sender: TObject);
var
str,str1:string;
i,j,k,m:integer;
begin
j:=0;
for i:=0 to memo1.Lines.Count-1 do
begin
for k:=0 to length(memo1.Lines.Strings)-1 do
begin
str:='' ;
str:=copy(memo1.Lines.Strings,k*length(edit1.Text)+1,length(edit1.Text));
if edit1.Text=str then
j:=j+1;
end
end;
label1.Caption:=inttostr(j);
end;
希望有用。。。。
 
var
TmpList : TStringlist;
i,Times : integer;
begin
Times := 0;
TmpList := TStringList.Create;
TmpList.LoadFormFile('c:/aaa.txt');
for i := 0 to TmpList.Count - 1 do
begin
if Pos(UpperCase('YourStr',UpperCase(TmpList.Strings)) > 0 then
Inc(Times);
end;
ShowMessage('共出现了'+inttostr(Times)+'次');
end;
 
我突然想到一个问题
如果在一行中,出现两次youStr,那记数器不是只记一次?
 
同意Y.lin
 
var
a,b:integer;
list:TStrings;
begin
list:=Tstringlist.Create;
list.add('abc');
list.add('ebbf');
list.add('fbdb');
//showmessage(inttostr(list.count));
a:=list.count;
list.text :=StringReplace(list.text,'b',#13#10,[rfReplaceAll]);
// showmessage(inttostr(list.count));
b:=list.Count;
showmessage('共出现了:'+inttostr(b-a)+'次!');
list.Destroy;
end;
 
如果这是一道满分100的题目,能拿80分或以上的解答尚未出现.

keen的想法是对的,但关键是怎么实现没有提及;
独舞和李翔鹏正如独舞自己说的,一行内出现两个匹配就不对了;
Y.lin和sunde11只从子串长度整数倍的地方开始尝试匹配,不知道是为什么,结果好象是不对的;
wqhatnet用换行替换子串,然后直接计算行数的想法很巧妙,应当在实现中借鉴.但唯一遗憾的是StringReplace是用StrPos实现子串定位的,看它虽然是汇编实现的,但还是两层循环一个字符一个字符滑动

俺很久以前用类似的方法实现了这样的字符串查找,因为效率低被一位大侠批评了.虽然从那个帖子没拿到分,但恶补了快速子串定位的算法,值啊.
帖子太老了有心的话可以去找一找,搜"远帆"大侠的答帖就行.
 
向楼上前辈学习。
 
楼上还是找远帆的帖子去学习吧,如果我没记错,他搜10M数量级的文本用时百毫秒级.(4-5年前的机器)

建议楼主在没见到时间复杂度为O(n+m)或更优([:D])的算法之前不要散分.
 
http://www.51zhan.com 最好的网址站
 
to LeeChange:这仅仅是一个模式匹配的算法。我记得清华的那本数据结构书上就有。好像叫kmp算法吧。
 
to 楼上:
是哎,几乎所有的算法书上都有,问题是怎就不见人用这么经典的算法来解答这题呢,郁闷哎.
绿皮书上的kmp算法可能还有一点改进的空间,而且实际运用中处理大文件时还需要些技巧.
 
文件有多大?
大到什么程度
 
请问: dinglj1760,LeeChange
你们说的那本清华的那本数据结构书的全面是什么,作者是那位。谢谢,我想下来学习下。
 
后退
顶部