diff options
Diffstat (limited to 'rushs/tinyprintf/levenshtein/levenshtein.c')
| -rw-r--r-- | rushs/tinyprintf/levenshtein/levenshtein.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/rushs/tinyprintf/levenshtein/levenshtein.c b/rushs/tinyprintf/levenshtein/levenshtein.c new file mode 100644 index 0000000..4da9397 --- /dev/null +++ b/rushs/tinyprintf/levenshtein/levenshtein.c @@ -0,0 +1,72 @@ +#include "levenshtein.h" + +#include <stdio.h> + +size_t max(size_t a, size_t b) +{ + if (a >= b) + { + return a; + } + return b; +} + +size_t min(size_t a, size_t b) +{ + if (a <= b) + { + return a; + } + return b; +} + +size_t min_3(size_t a, size_t b, size_t c) +{ + if (a <= b) + { + if (a <= c) + { + return a; + } + return c; + } + else + { + if (b <= c) + { + return b; + } + return c; + } +} + +size_t my_strlen(const char *s) +{ + size_t i; + for (i = 0; s[i]; i++) + { + continue; + } + return i; +} + +size_t levenshtein(const char *s1, const char *s2) +{ + size_t l1 = my_strlen(s1); + size_t l2 = my_strlen(s2); + if (min(l1, l2) == 0) + { + return max(l1, l2); + } + + if (s1[0] == s2[0]) + { + return levenshtein(s1 + 1, s2 + 1); + } + + size_t lev1 = levenshtein(s1 + 1, s2); + size_t lev2 = levenshtein(s1, s2 + 1); + size_t lev3 = levenshtein(s1 + 1, s2 + 1); + + return 1 + min_3(lev1, lev2, lev3); +} |
