Občas je potřeba zjistit, nakolik si jsou 2 stringy podobné – Google tak například odhaluje překlepy a jiné služby zase například mohou zajistit, aby heslo nebylo příliš podobné uživatelskému jménu; možností využití je zkrátka hodně. Zkoušeli jste se někdy zamyslet, jak takovou funkci implementovat?
(Na úvod: několik algoritmů řešících tento problém samozřejmě existuje, ale v tomto případě jsem radši místo Googlu potrápil vlastní hlavu, protože jako aplikačnímu programátorovi se mi nestává často, že bych se setkal s funkcí, která je implementačně zajímavá a vysoce užitečná zároveň :) Pokud tedy rádi přemýšlíte nad problémy jako já, pokračujte.)
Na začátek nějaké příklady:
- „abc“ ↔ „abc“ má vrátit nulu (žádné rozdíly)
- „abc“ ↔ „abX“ vrátí 1 (1 rozdíl)
- „abc“ ↔ „XXabc“ vrátí 2
- „Johny Dep“ ↔ „Johnny Depp“ vrátí 2
Jinak (hodně matematicky a nepěkně) řečeno, máte najít počet operací přidání, odebrání nebo změny znaku, pomocí kterých lze string 1 převést na string 2.
Po určitém průzkumu možností se mi zdá, že máte 3 možnosti:
- Najdete relativně jednoduchý algoritmus, o kterém si však budete jen myslet, že funguje :)
- Najdete programátorsky elegantní algoritmus, který bude fungovat, ale budete mít pocit, že výpočetní složitost by mohla být lepší
- Najdete algoritmus, který bude správný a současně optimální z hlediska výpočetní obtížnosti. Co jsem tak viděl, tak dosažení tohoto třetího bodu vyžaduje kousek matematické geniality a pravděpodobně se vylučuje s programátorskou elegancí, jak už to tak bývá
Dvojka pro mě byla tak akorát (a pomýšlení na trojku bych v mém případě považoval skoro za rouhání :), ale i tak jsem si cestou užil dost zábavy. Přeji příjemné řešení!
Tak tohle jsme měli ve škole v jednom nejmenovaném předmětu. Není třeba vymýšlet něco, co už dávno někdo chytřejší vymyslel. http://en.wikipedia.org/wiki/Levenshtein_distance
V PHP je na to nečekaně funkce levenshtein :)
Kdo to nezná, dozví se to po volbě bodu nula: Ask Google.
BB: Martine, ve všem máš pravdu a v PHP jsou na to minimálně 2 dobře použitelné funkce, ale o tom zápisek není. Tvůj komentář proto činím trochu míň čitelným :)