Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Aug 28, 2010, 4:48:48 PM (15 years ago)
Author:
landauf
Message:

added a function to compute the Levenshtein distance between two strings to StringUtils.
used this in CommandEvaluation to correct misspelled commands (not automatically though, just to print a suggestion to the user)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/consolecommands3/src/libraries/util/StringUtils.cc

    r6424 r7238  
    514514        @return Number of replacements
    515515    */
    516     _UtilExport size_t replaceCharacters(std::string& str, char target, char replacement)
     516    size_t replaceCharacters(std::string& str, char target, char replacement)
    517517    {
    518518        size_t j = 0;
     
    527527        return j;
    528528    }
     529
     530    /**
     531        @brief Calculates the Levenshtein distance between two strings.
     532
     533        The Levenshtein distance is defined by the number of transformations needed to convert str1
     534        into str2. Possible transformations are substituted, added, or removed characters.
     535    */
     536    unsigned int getLevenshteinDistance(const std::string& str1, const std::string& str2)
     537    {
     538        size_t cols = str1.size() + 1;
     539        size_t rows = str2.size() + 1;
     540        int matrix[rows][cols];
     541
     542        for (size_t r = 0; r < rows; ++r)
     543            for (size_t c = 0; c < cols; ++c)
     544                matrix[r][c] = 0;
     545
     546        for (size_t i = 1; i < cols; ++i)
     547            matrix[0][i] = i;
     548        for (size_t i = 1; i < rows; ++i)
     549            matrix[i][0] = i;
     550
     551        for (size_t r = 1; r < rows; ++r)
     552            for (size_t c = 1; c < cols; ++c)
     553                matrix[r][c] = (str1[c-1] != str2[r-1]);
     554
     555        for (size_t r = 1; r < rows; ++r)
     556            for (size_t c = 1; c < cols; ++c)
     557                matrix[r][c] = std::min(std::min(matrix[r-1][c] + 1, matrix[r][c-1] + 1), matrix[r-1][c-1] + (str1[c-1] != str2[r-1]));
     558
     559        return matrix[rows-1][cols-1];
     560    }
    529561}
Note: See TracChangeset for help on using the changeset viewer.