levenshtein.hpp 874 B

12345678910111213141516171819202122232425262728293031
  1. #pragma once
  2. #include <utility>
  3. #include <queue>
  4. template <class T, typename SIZE=unsigned int>
  5. int levenshtein(const T &a, const T &b, const SIZE aSize, const SIZE bSize)
  6. {
  7. int **items = new int*[aSize +1]();
  8. for (SIZE i =0; i <= aSize; i++)
  9. {
  10. items[i] = new int[bSize +1]();
  11. items[i][0] = i;
  12. if (i == 0)
  13. for (SIZE j =1; j <= bSize; j++)
  14. items[i][j] = j;
  15. else
  16. for (SIZE j =1; j <= bSize; j++)
  17. items[i][j] = std::min(std::min(
  18. items[i][j -1] +1,
  19. items[i -1][j] +1),
  20. (items[i -1][j -1] + (a[i -1] == b[j -1] ? 0 : 1)));
  21. }
  22. const int levenshtein = items[aSize][bSize];
  23. for (SIZE i =0; i < aSize +1; i++)
  24. delete[] items[i];
  25. delete[] items;
  26. return levenshtein;
  27. }