Я понимаю, как работают эвристики плохих персонажей. Когда вы найдете несогласованную букву x
, просто сдвиньте шаблон так, чтобы самый правый x
в шаблоне был выровнен с x
в строке. И это легко реализовать в коде.
Думаю, я также понимаю, как работают эвристики хорошего суффикса. Когда мы найдем хороший суффикс s
, найдите тот же суффикс в другом месте в шаблоне и сдвиньте его так, чтобы s
в шаблоне был выровнен с s
в строке. Но я не понимаю, как это сделать в коде. Как мы можем найти, существует ли тот же суффикс в другом месте в шаблоне? И как мы узнаем его позицию? Код:
void bmPreprocess1()
{
int i=m, j=m+1;
f[i]=j;
while (i>0)
{
while (j<=m && p[i-1]!=p[j-1])
{
if (s[j]==0) s[j]=j-i;
j=f[j];
}
i--; j--;
f[i]=j;
}
}
from http://www.iti.fh-flensburg.de/lang/algorithmen/pattern/bmen.htm не имеет смысла для меня... Может ли кто-нибудь писать как можно более простой псевдокод для этой задачи? Или объяснить как-то?