Wskazówka:
Potrzebne nam będzie najpierw rozwiązanie bardzo prostego problemu: mając dane dwa słowa tej samej długości n, chcemy sprawdzić, czy są one identyczne. Odpowiedni algorytm
powinien wyglądać podobnie do następującego:
Dane:
słowa A[1..n] i B[1..n]
Wynik:
„TAK”, jeśli są identyczne, „NIE”, jeśli są różne.
identyczne ← prawda
dla i = 1,2,..., n
jeżeli A[i] ≠ B[i] wykonuj
identyczne ← fałsz
jeżeli identyczne = prawda
wypisz „TAK”
w przeciwnym razie
wypisz „NIE”
Algorytm sprawdza, czy kolejne litery obu słów są zgodne. W razie znalezienia niezgodności
przestawia zmienną identyczne na wartość fałsz, którą zachowa ona do końca działania.
Za pomocą tej prostej procedury możemy teraz zrealizować wyszukiwanie w tablicy znaków
tekst[1..n] słowa wzorzec[1..m] — na razie dokładnie, bez dozwolonego jednego błędu. Aby
to osiągnąć, sprawdzamy najpierw, czy wzorzec[1..m] jest identyczny z fragmentem
tekst[1..m]. Jeśli tak, znaleźliśmy wystąpienie wzorca. Jeśli nie, sprawdzamy fragment
tekst[2..m+1], a potem, być może, tekst[3..m+2] i tak aż do końca tekstu, czyli do ostatniego
możliwego fragmentu tekst[n-m+1..n]. Odpowiednia pętla wygląda następująco:
dla i = 1, 2, ..., n–m+1 wykonuj
identyczne ← prawda
dla j = 1, 2, ..., m wykonuj
jeżeli wzorzec[j] ≠ tekst[i+j-1]
identyczne ← fałsz
jeżeli identyczne = prawda
wypisz „TAK”
zakończ algorytm
wypisz „NIE”
Zmienna i wskazuje pierwszy znak sprawdzanego fragmentu — porównujemy w każdym
momencie wzorzec[1..m] oraz tekst[i..i+m-1].
Ostatnim krokiem prowadzącym do rozwiązania zadania jest uwzględnienie jednego dozwolonego błędu w porównywaniu. Zauważmy, że dotychczas już przy pierwszej niezgodności
znaków przestawialiśmy zmienną identyczne na fałsz do końca sprawdzania. Zamiast tego
policzymy niezgodne znaki w osobnej zmiennej błędy podczas porównywania, za każdą różnicę dodając do niej 1. Odpowiednia zmiana w algorytmie jest bardzo niewielka:
dla i = 1, 2, ..., n–m+1 wykonuj
bledy ← 0
dla j = 1, 2, ..., m wykonuj
jeżeli wzorzec[j] ≠ tekst[i+j-1]
błędy ← błędy + 1
jeżeli błędy ≤ 1
wypisz „TAK”
zakończ wykonywanie algorytmu
wypisz „NIE”
Takie rozwiązanie, podobnie jak poprzednie, porównuje wszystkie możliwe fragmenty tekstu
z wzorcem, ale teraz dla każdego z nich oblicza, ile znaków jest niezgodnych. Algorytm odpowiada TAK, jeśli którykolwiek fragment ma tych znaków nie więcej niż jeden. Jeśli
wszystkie fragmenty mają co najmniej dwa niezgodne znaki, odpowiedzią jest NIE.