首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新Knuth、Morris、Pratt算法以使用unicode

更新Knuth、Morris、Pratt算法以使用unicode
EN

Stack Overflow用户
提问于 2016-11-01 17:19:09
回答 1查看 276关注 0票数 0

我有一些旧的代码(由别人写的),我需要修复它们,以便在Delphi10.1中使用Unicode字符串。编辑:我已经将我的问题缩小到以下范围:下面的代码使用unicode字符串失败。有什么建议吗?

代码语言:javascript
复制
//global variable:  
var
  UpCaseLookup : array[ 1..255 ] of char; 


// ---- Knuth, Morris, Pratt:
type
    failure  = array[1..255] of word;

procedure PrepareUpcaseLookup;
var
  S : string; //was shortstring;
  i : integer;
begin
  for i := 1 to 255 do
  begin
    S := ToUpper( chr(i) ); //was AnsiUpperCase
    UpCaseLookup[i] := S[1]
  end
end;
EN

回答 1

Stack Overflow用户

发布于 2016-11-02 14:51:37

代码语言:javascript
复制
  function PosKnuthMorrisPratt(Pattern, Text: string): Integer;
  var
    Prefix: array of Integer;
    i, k: Integer;
  begin
    Result := 0;
    if (Pattern = '') or (Text = '') then
      Exit;

    Pattern := UpperCase(Pattern); // case-insensitive
    Text := UpperCase(Text);

    // Buld prefix function array
    SetLength(Prefix, Length(Pattern) + 1);
    Prefix[1] := 0;
    k := 0;
    for i := 2 to Length(Pattern) do begin
      while (k > 0) and (Pattern[k + 1] <> Pattern[i]) do
        k := Prefix[k];
      if Pattern[k + 1] = Pattern[i] then
        Inc(k);
      Prefix[i] := k;
    end;

    k := 0;
    for i := 1 to Length(Text) do begin
      while (k > 0) and (Pattern[k + 1] <> Text[i]) do
        k := Prefix[k];
      if Pattern[k + 1] = Text[i] then
        Inc(k);
      if k = Length(Pattern) then
        Exit(i + 1 - Length(Pattern));
    end;
  end;

begin
  Memo1.Lines.Add(IntToStr(PosKnuthMorrisPratt('abaBc', 'ggabagabAbccsab')));
  Memo1.Lines.Add(IntToStr(PosKnuthMorrisPratt('ab', 'ggagbc')));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40357109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档