#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Returns and memoizes the edit distance from a + i to b + j
*/
int dist_(int memo[12][12], const char *a, const char *b, int i, int j)
{
int ans = memo[i][j];
if (ans < 0) {
if (a[i] && b[j]) {
if (a[i] == b[j]) {
ans = dist_(memo, a, b, i + 1, j + 1);
} else {
int ans1 = dist_(memo, a, b, i + 1, j + 0);
int ans2 = dist_(memo, a, b, i + 0, j + 1);
int ans3 = dist_(memo, a, b, i + 1, j + 1);
if (ans3 < ans1 && ans3 < ans2) {
ans = ans3 + 1;
} else {
if (ans1 < ans2) {
ans = ans1 + 1;
} else {
ans = ans2 + 1;
}
}
}
} else {
}
memo[i][j] = ans;
}
return ans;
}
/*
* Font end to recursive distance function
*/
int distance(const char *a, const char *b)
{
int memo[12][12];
memset(memo
, -1, sizeof(memo
));
return dist_(memo, a, b, 0, 0);
}
/*
* Driver code for some simple tests
*/
int failed(const char *a, const char *b, int expected)
{
int res = distance(a, b);
printf("dist('%s', '%s') == %d", a
, b
, res
);
if (res == expected) {
return 0;
}
printf(", but expected %d\n", expected
);
return 1;
}
int main(void)
{
int fail = failed("editing", "distance", 5)
+ failed("distance", "editing", 5)
+ failed("kitten", "sitting", 3)
+ failed("sitting", "kitten", 3)
+ failed("crimson", "crimson", 0)
+ failed("fish", "fishy", 1);
printf("\n%d failed tests.\n", fail
);
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8qCiAqICAgICAgUmV0dXJucyBhbmQgbWVtb2l6ZXMgdGhlIGVkaXQgZGlzdGFuY2UgZnJvbSBhICsgaSB0byBiICsgagogKi8KaW50IGRpc3RfKGludCBtZW1vWzEyXVsxMl0sIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIGludCBpLCBpbnQgaikKewogICAgaW50IGFucyA9IG1lbW9baV1bal07CgogICAgaWYgKGFucyA8IDApIHsKICAgICAgICBpZiAoYVtpXSAmJiBiW2pdKSB7CiAgICAgICAgICAgIGlmIChhW2ldID09IGJbal0pIHsKICAgICAgICAgICAgICAgIGFucyA9IGRpc3RfKG1lbW8sIGEsIGIsIGkgKyAxLCBqICsgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnQgYW5zMSA9IGRpc3RfKG1lbW8sIGEsIGIsIGkgKyAxLCBqICsgMCk7CiAgICAgICAgICAgICAgICBpbnQgYW5zMiA9IGRpc3RfKG1lbW8sIGEsIGIsIGkgKyAwLCBqICsgMSk7CiAgICAgICAgICAgICAgICBpbnQgYW5zMyA9IGRpc3RfKG1lbW8sIGEsIGIsIGkgKyAxLCBqICsgMSk7CgogICAgICAgICAgICAgICAgaWYgKGFuczMgPCBhbnMxICYmIGFuczMgPCBhbnMyKSB7CiAgICAgICAgICAgICAgICAgICAgYW5zID0gYW5zMyArIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChhbnMxIDwgYW5zMikgewogICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBhbnMxICsgMTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBhbnMyICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbnMgPSBzdHJsZW4oYSArIGkpCiAgICAgICAgICAgICAgICArIHN0cmxlbihiICsgaik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIG1lbW9baV1bal0gPSBhbnM7CiAgICB9CiAgICAKICAgIHJldHVybiBhbnM7Cn0KCi8qCiAqICAgICAgRm9udCBlbmQgdG8gcmVjdXJzaXZlIGRpc3RhbmNlIGZ1bmN0aW9uCiAqLwppbnQgZGlzdGFuY2UoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKewogICAgaW50IG1lbW9bMTJdWzEyXTsKICAgIAogICAgbWVtc2V0KG1lbW8sIC0xLCBzaXplb2YobWVtbykpOwogICAgCiAgICByZXR1cm4gZGlzdF8obWVtbywgYSwgYiwgMCwgMCk7Cn0KCgoKLyoKICogICAgICBEcml2ZXIgY29kZSBmb3Igc29tZSBzaW1wbGUgdGVzdHMKICovCmludCBmYWlsZWQoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYiwgaW50IGV4cGVjdGVkKQp7CiAgICBpbnQgcmVzID0gZGlzdGFuY2UoYSwgYik7CiAgICAKICAgIHByaW50ZigiZGlzdCgnJXMnLCAnJXMnKSA9PSAlZCIsIGEsIGIsIHJlcyk7CiAgICAKICAgIGlmIChyZXMgPT0gZXhwZWN0ZWQpIHsKICAgICAgICBwcmludGYoIiBva1xuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICBwcmludGYoIiwgYnV0IGV4cGVjdGVkICVkXG4iLCBleHBlY3RlZCk7CgogICAgcmV0dXJuIDE7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIGludCBmYWlsID0gZmFpbGVkKCJlZGl0aW5nIiwgImRpc3RhbmNlIiwgNSkKICAgICAgICAgICAgICsgZmFpbGVkKCJkaXN0YW5jZSIsICJlZGl0aW5nIiwgNSkKICAgICAgICAgICAgICsgZmFpbGVkKCJraXR0ZW4iLCAic2l0dGluZyIsIDMpCiAgICAgICAgICAgICArIGZhaWxlZCgic2l0dGluZyIsICJraXR0ZW4iLCAzKQogICAgICAgICAgICAgKyBmYWlsZWQoImNyaW1zb24iLCAiY3JpbXNvbiIsIDApCiAgICAgICAgICAgICArIGZhaWxlZCgiZmlzaCIsICJmaXNoeSIsIDEpOwogICAgICAgICAgICAgCiAgICBwcmludGYoIlxuJWQgZmFpbGVkIHRlc3RzLlxuIiwgZmFpbCk7CgogICAgcmV0dXJuIDA7Cn0K