struct retCount{ int lngSubRows; int lngCountLike;};retCount Matching(QString InputA, QString InputB, int lngLen){ retCount TempRet; int PosStrB; int PosStrA; QString StrA; QString StrB; QString StrTempA; QString StrTempB; QString StrInputA = InputA.toLower(); QString StrInputB = InputB.toLower(); StrA = StrInputA; StrB = StrInputB; for ( PosStrA = 1; PosStrA <= (StrA.length() - lngLen + 1); ++PosStrA){ StrTempA = StrA.mid(PosStrA, lngLen); PosStrB = 1; for (PosStrB = 1; PosStrB <= (StrB.length() - lngLen + 1); ++PosStrB){ StrTempB = StrB.mid(PosStrB, lngLen); if (StrTempA == StrTempB){ TempRet.lngCountLike++; break; } } TempRet.lngSubRows++; } return TempRet;}int IndistinctMatching(QString InputMatching, QString InputStandart, int MaxMatching = 4){ QString strInputMatching = InputMatching.toLower(); QString strInputStandart = InputStandart.toLower(); retCount gret; retCount tret; int lngCurLen; //текущая длина подстроки //если не передан какой-либо параметр, то выход if ((MaxMatching == 0) || (strInputMatching.length() == 0) || (strInputStandart.length() == 0)){ return 0; } gret.lngCountLike = 0; gret.lngSubRows = 0; // Цикл прохода по длине сравниваемой фразы for (lngCurLen = 1; lngCurLen <= MaxMatching; ++lngCurLen){ //Сравниваем строку A со строкой B tret = Matching(strInputMatching, strInputStandart, lngCurLen); gret.lngCountLike = gret.lngCountLike + tret.lngCountLike; gret.lngSubRows = gret.lngSubRows + tret.lngSubRows; //Сравниваем строку B со строкой A tret = Matching(strInputStandart, strInputMatching, lngCurLen); gret.lngCountLike = gret.lngCountLike + tret.lngCountLike; gret.lngSubRows = gret.lngSubRows + tret.lngSubRows; } if (gret.lngSubRows == 0){ return 0; } //избыточность сделал для удобства отладки float rez = ((float)gret.lngCountLike/(float)gret.lngSubRows); rez = rez*100; return (int)rez;}
/*MaxMatching - максимальная длина подстроки (достаточно 3-4)strInputMatching - сравниваемая строкаstrInputStandart - строка-образецСравнивание без учета регистраif (IndistinctMatching(4, "поисковая строка", "оригинальная строка - эталон") > 40) ...*/struct retCount{ int lngSubRows; int lngCountLike;};retCount Matching(QString InputA, QString InputB, int lngLen){ retCount TempRet; TempRet.lngCountLike = 0; TempRet.lngSubRows = 0; int PosStrB = 0; int PosStrA = 0; QString StrTempA = ""; QString StrTempB = ""; QString StrInputA = InputA.toLower(); QString StrInputB = InputB.toLower(); QString StrA = StrInputA; QString StrB = StrInputB; for ( PosStrA = 1; PosStrA <= (StrA.length() - lngLen + 1); ++PosStrA){ StrTempA = StrA.mid(PosStrA, lngLen); PosStrB = 1; for (PosStrB = 1; PosStrB <= (StrB.length() - lngLen + 1); ++PosStrB){ StrTempB = StrB.mid(PosStrB, lngLen); if (StrTempA == StrTempB){ TempRet.lngCountLike++; break; } } TempRet.lngSubRows++; } return TempRet;}int IndistinctMatching(QString InputMatching, QString InputStandart, int MaxMatching = 4){ QString strInputMatching = InputMatching.toLower(); QString strInputStandart = InputStandart.toLower(); retCount gret; gret.lngCountLike = 0; gret.lngSubRows = 0; retCount tret; tret.lngCountLike = 0; tret.lngSubRows = 0; int lngCurLen = 0; //текущая длина подстроки //если не передан какой-либо параметр, то выход if ((MaxMatching == 0) || (strInputMatching.length() == 0) || (strInputStandart.length() == 0)){ return 0; } // Цикл прохода по длине сравниваемой фразы for (lngCurLen = 1; lngCurLen <= MaxMatching; ++lngCurLen){ //Сравниваем строку A со строкой B tret = Matching(strInputMatching, strInputStandart, lngCurLen); gret.lngCountLike = gret.lngCountLike + tret.lngCountLike; gret.lngSubRows = gret.lngSubRows + tret.lngSubRows; //Сравниваем строку B со строкой A tret = Matching(strInputStandart, strInputMatching, lngCurLen); gret.lngCountLike = gret.lngCountLike + tret.lngCountLike; gret.lngSubRows = gret.lngSubRows + tret.lngSubRows; } if (gret.lngSubRows == 0){ return 0; } float rez = ((float)gret.lngCountLike/(float)gret.lngSubRows); rez = rez*100; return (int)rez;}