求:查询字符串中出现次数最多的字符的算法(200分)

  • 主题发起人 主题发起人 bacal
  • 开始时间 开始时间
B

bacal

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一字符串。现在要找出里面出现次数最多的字符。该怎么做呢
例如 adberdaaegd
可见里面a出现的次数是最多的。
想把a 这个最多的找出来。。该怎么弄啊
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
SI:String;
function GetSL(Source:String):TStringList;
function GetValue(Source:String):String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SI:='adberdaaegd';
end;

function TForm1.GetSL(Source:String):TStringList;
var i:Integer;
S:String;
SL:TStringList;
begin
SL:=TStringList.Create;
for i:=1 to length(Source) do begin
S:=Source;
if SL.IndexOf(S)=-1 then SL.Add(S);
end;
Result:=SL;
end;
function TForm1.GetValue(Source:String):String;
var SL:TStringList;
i,j,iC:Integer;
S,Str:String;
begin
Str:='';IC:=0;
SL:=GetSL(Source);
for i:=0 to SL.Count-1 do begin
S:=SL;
j:=Length(Source)-Length(StringReplace(Source,S,'',[rfReplaceAll]));
if j>IC then begin
IC:=j;Str:=S;
end;
end;
Result:=Str;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:=GetValue(SI);
showmessage(s);
end;

end.
思路是先获得不重复的字符,然后得到出现次数最大的字符,想要进行其他操作就要自己写一些代码了
 
建立一个长度为26的数组(就是26个坑)
int keng[26];
// Init
for (int i=0;i<26;i++)
keng=0;
// search
for (int i=0;i<strLength;i++)
keng[str-'a']++;
// 再找一边就可以了
for (...)

如果要处理所有ascii码,开256大小的坑吧~
 
恩,MrMengYi的算法比较简单点,如果字符串巨长的话还可以想办法优化下算法。
 
楼上的是c文吧,反正按楼上的思路走,就对了。
 
delphi写的有点复杂,还是c简洁,思路能表达的清晰些,呵呵
感觉题目像面试题啊~
 
嗯,MrMengyi的方法不错!
 
function GetStrMax(s: string): string;
function GetStrDelimitedLength(DText:string;D: char):integer;
var
ts:TStringList;
tmp:string;
begin
tmp:=DText;
ts:=TStringList.Create;
ts.Delimiter:=D;
ts.DelimitedText:=tmp;
Result:=ts.Count-1;
ts.Free;
end;
var
s1:string;
i,k:integer;
begin
k:=0;
for i:=1 to length(s) do
begin
if GetStrDelimitedLength(s,s)>k then
begin
k:=GetStrDelimitedLength(s,s);
s1:=s;
end;
end;
Result:=s1;
end;

好玩 临时也写了个土制函数 见笑了

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=GetStrMax('adberdaaegd');
end;
 
如果要求出同时最大的 只要加个IF 判断=的情况 然后 s1:=s1+s;就可以
 
用DelimitedText也是不错的注意,哈哈
不过效率有点低了哇
 
可采用遞歸方法。
 
后退
顶部