summaryrefslogtreecommitdiffstats
path: root/src/CRSMUtil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CRSMUtil.cpp')
-rw-r--r--src/CRSMUtil.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/CRSMUtil.cpp b/src/CRSMUtil.cpp
new file mode 100644
index 0000000..91fa057
--- /dev/null
+++ b/src/CRSMUtil.cpp
@@ -0,0 +1,50 @@
+#include "CRSMUtil.hpp"
+
+namespace Util {
+ int damerauLevenshteinDistance(const QString& s1, const QString& s2)
+ {
+ int length1 = s1.length();
+ int length2 = s2.length();
+ int d[length1+1][length2+1];
+
+ int i;
+ int j;
+ int cost;
+
+ for(i = 0; i <= length1; i++)
+ {
+ d[i][0] = i;
+ }
+ for(j = 0; j <= length2; j++)
+ {
+ d[0][j] = j;
+ }
+ for (i = 0; i < length1;i++)
+ {
+ for(j = 0; j < length2; j++)
+ {
+ if(s1[i] == s2[j])
+ {
+ cost = 0;
+ }
+ else
+ {
+ cost = 1;
+ }
+ d[i+1][j+1] = std::min({
+ d[i][j+1] + 1, // delete
+ d[i+1][j] + 1, // insert
+ d[i][j] + cost // substitution
+ });
+ if((i > 0) && (j > 0) && (s1[i] == s2[j-1]) && (s1[i-1] == s2[j]))
+ {
+ d[i+1][j+1] = std::min(
+ d[i+1][j+1],
+ d[i-1][j-1] + cost // transposition
+ );
+ }
+ }
+ }
+ return d[length1][length2];
+ }
+}