Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Левенштейн
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <regex>
- std::string stringNormalization(std::string str) {
- const std::regex regexFirst{ R"(_|[^\d\w\s])" };
- const std::regex regexSecond{ R"(\b\w{1,3}\b)" };
- const std::regex regexThird{ R"(\s{2,})" };
- str = std::regex_replace(str, regexFirst, "");
- str = std::regex_replace(str, regexSecond, "");
- str = std::regex_replace(str, regexThird, " ");
- std::transform(str.begin(), str.end(), str.begin(), ::tolower);
- str = std::regex_replace(str, std::regex("^ +"), "");
- return str;
- }
- int LevensteinDistance(std::string str1, std::string str2) {
- int matrix[str1.length() + 1][str2.length() + 1];
- for (int i{}; i < str1.length() + 1; ++i) {
- for (int j{}; j < str2.length() + 1; ++j) {
- if (i * j == 0) {
- matrix[i][j] = std::max(i, j);
- }
- }
- }
- for (int i{ 1 }; i < str1.length() + 1; ++i) {
- for (int j{ 1 }; j < str2.length() + 1; ++j) {
- if (str1[i-1] == str2[j-1]) {
- matrix[i][j] = matrix[i - 1][j - 1];
- } else {
- matrix[i][j] = std::min({matrix[i - 1][j - 1], matrix[i - 1][j], matrix[i][j - 1]}) + 1;
- }
- }
- }
- return matrix[str1.length()][str2.length()];
- }
- int main() {
- std::string inputFirst, inputSecond;
- std::getline(std::cin, inputFirst);
- std::getline(std::cin, inputSecond);
- inputFirst = stringNormalization(inputFirst);
- inputSecond = stringNormalization(inputSecond);
- std::cout << LevensteinDistance(inputFirst, inputSecond) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement