Düzenleme Mesafesi
Dinamik Programlama O(m · n) O(m · n)Bir dizeyi diğerine çevirmek için en az tek-karakter ekleme, silme veya değiştirme (Levenshtein).
1/127
"" dizgisini "SATURDAY" dizgisinin ilk 0 karakterine çevirmek 0 ekleme gerektirir.
Değişmezdp[i][j], a'nın ilk i karakterini b'nin ilk j karakterine çevirmenin en ucuz yoludur.
edit-distance.c
int min3(int a, int b, int c) {int m = a < b ? a : b;return m < c ? m : c;}int editDistance(const char *a, const char *b) {int m = strlen(a), n = strlen(b);int dp[m + 1][n + 1];for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {if (i == 0)dp[i][j] = j;else if (j == 0)dp[i][j] = i;else if (a[i - 1] == b[j - 1])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = 1 + min3(dp[i - 1][j - 1],dp[i - 1][j], dp[i][j - 1]);}}return dp[m][n];}
Düzenleme Mesafesi nasıl çalışır?
dp[i][j] = A'nın ilk i karakterini B'nin ilk j karakterine çevirmenin en ucuz yolu. Eşit karakterler bedava; değilse değiştir (köşegen), sil (üst), ekle (sol) seçeneklerinin iyisine 1 öde.
Ne zaman kullanılır?
Yazım denetimi, bulanık arama, diff, DNA mutasyon mesafesi.