Advertisement
Tark_Wight

Untitled

Jun 30th, 2023
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. // Левенштейн
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <regex>
  6.  
  7.  
  8. std::string stringNormalization(std::string str) {
  9. const std::regex regexFirst{ R"(_|[^\d\w\s])" };
  10. const std::regex regexSecond{ R"(\b\w{1,3}\b)" };
  11. const std::regex regexThird{ R"(\s{2,})" };
  12.  
  13. str = std::regex_replace(str, regexFirst, "");
  14. str = std::regex_replace(str, regexSecond, "");
  15. str = std::regex_replace(str, regexThird, " ");
  16.  
  17. std::transform(str.begin(), str.end(), str.begin(), ::tolower);
  18.  
  19. str = std::regex_replace(str, std::regex("^ +"), "");
  20.  
  21. return str;
  22. }
  23.  
  24.  
  25. int LevensteinDistance(std::string str1, std::string str2) {
  26. int matrix[str1.length() + 1][str2.length() + 1];
  27.  
  28. for (int i{}; i < str1.length() + 1; ++i) {
  29. for (int j{}; j < str2.length() + 1; ++j) {
  30. if (i * j == 0) {
  31. matrix[i][j] = std::max(i, j);
  32. }
  33. }
  34. }
  35.  
  36. for (int i{ 1 }; i < str1.length() + 1; ++i) {
  37. for (int j{ 1 }; j < str2.length() + 1; ++j) {
  38. if (str1[i-1] == str2[j-1]) {
  39. matrix[i][j] = matrix[i - 1][j - 1];
  40. } else {
  41. matrix[i][j] = std::min({matrix[i - 1][j - 1], matrix[i - 1][j], matrix[i][j - 1]}) + 1;
  42. }
  43. }
  44. }
  45.  
  46. return matrix[str1.length()][str2.length()];
  47. }
  48.  
  49. int main() {
  50. std::string inputFirst, inputSecond;
  51.  
  52. std::getline(std::cin, inputFirst);
  53. std::getline(std::cin, inputSecond);
  54.  
  55. inputFirst = stringNormalization(inputFirst);
  56. inputSecond = stringNormalization(inputSecond);
  57.  
  58. std::cout << LevensteinDistance(inputFirst, inputSecond) << '\n';
  59.  
  60. return 0;
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement