一个艰巨的算法--谁来挑战

zjsyw 2002-05-08 10:42:06
本来想从技术的角度来讲,但太烦了,又不知如何组织语言。还是从客户的角度讲吧:
我们举个例子:有一本书《C++Builder使用大全及技巧》,客户在查询时有可能输为
《c ++ builder 使用大全》或者《c++builder使用达全即机巧》,总之各种可能都有
希望还能查到,怎么办?
...全文
99 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxj 2002-05-08
  • 打赏
  • 举报
回复
你是不是按拼音匹配,且忽略空格!我这里有一个Pascal程序或许对你有用


unit searchbypy;

interface
uses
SysUtils,Classes;
type
TSearchByPy=class
public
constructor Create(mystrs:TStrings);
destructor Destroy;override;
function SearchByPYIndexStr(SourceStrs:TStrings; PYIndexStr:string):string;
procedure SearchItemsBySpell(SpellStr:string;Destinstrs:tstrings);
function isalpha(source:string):boolean;
private
ChineseItems:TStringlist;
function GetPYIndexChar( hzchar:string):char;
end;

TStack=class
private
StackValue: TStringlist;
Function IsEmpty:boolean;
Function fcount:integer;
public
constructor Create;
Destructor Destory;
procedure Push(x:string);
Function Pop:string;
Function Gettop:string;
property ItemsCount:integer read fcount;
end;


implementation

constructor TSearchByPy.Create(mystrs:TStrings);
var index:integer;
begin
ChineseItems:=Tstringlist.create;
for index:=0 to Mystrs.count -1 do
begin
ChineseItems.add(mystrs.strings[index]);
end;
end;

destructor TSearchByPy.Destroy;
begin
ChineseItems.Free;

end;

function TSearchByPy.GetPYIndexChar( hzchar:string):char;
begin
if length(hzchar)<2 then
begin
result:=char(0);
exit;
end;
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
else
result := char(0);
end;
end;

function TSearchByPy.SearchByPYIndexStr( SourceStrs:TStrings; PYIndexStr:string):string;
label NotFound;
var
i, j :integer;
hzchar :string;
begin

for i:=0 to SourceStrs.Count-1 do
begin
for j:=1 to Length(PYIndexStr) do
begin
hzchar:=SourceStrs[i][2*j-1] + SourceStrs[i][2*j];
if (PYIndexStr[j]<>'?') and
(UpperCase(PYIndexStr[j]) <> GetPYIndexChar(hzchar)) then
goto NotFound;
end;
if result='' then
result := SourceStrs[i]
else
result := result + Char(13) + SourceStrs[i];
NotFound:
end;
end;
function TSearchByPy.isalpha(source:string):boolean;
var index:integer;
begin
result:=true;
for index:=1 to length(source) do
if not(UpCase(source[index]) in ['A'..'Z']) then
begin
result:=false;
end;
end;

procedure TSearchByPy.SearchItemsBySpell(SpellStr:string;Destinstrs:tstrings);
label NotFound;
var
i, j :integer;
hzchar :string;
begin
if not isalpha(SpellStr) then exit;
destinstrs.clear;
for i:=0 to ChineseItems.Count-1 do
begin
for j:=1 to Length(SpellStr) do
begin
hzchar:=Copy(ChineseItems.Strings[i],2*j-1,2);
if (Spellstr[j]<>'?') and
(UpperCase(Spellstr[j]) <> GetPYIndexChar(hzchar)) then
goto NotFound;
end;
Destinstrs.Add(ChineseItems.Strings[i]);
NotFound:
end;
end;


constructor TStack.create;
begin
StackValue:=Tstringlist.Create;
StackValue.Sorted:=false;
end;

Destructor TStack.Destory;
begin
StackValue.Free;
end;

Function TStack.IsEmpty:boolean;
begin
if StackValue.count=0 then
result:=true
else
result:=false;
end;

procedure TStack.Push(x:string);
var index:integer;
begin
if StackValue.Find(x,index) then
StackValue.Delete(index);
StackValue.Add(x);
end;
Function TStack.Pop:string;
begin
if IsEmpty then
result:=''
else
begin
result:=StackValue.Strings[(StackValue.Count) -1];
StackValue.Delete((StackValue.Count) -1);
end;
end;

Function TStack.Gettop:string;
begin
if IsEmpty then
result:=''
else
begin
result:=StackValue.Strings[(StackValue.Count) -1];
end;
end;

Function TStack.fcount:integer;
begin
result:=StackValue.count;
end;
end.
one_add_one 2002-05-08
  • 打赏
  • 举报
回复
用关键字查找

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧