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, ..., nm+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, ..., nm+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.
Powrót do pytań