summaryrefslogtreecommitdiffstats
path: root/src/CRSMUtil.cpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2018-06-06 21:37:05 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2018-06-06 21:42:39 +0200
commit6cfb0e4b2bd7904c771914dd5030c54a2540e156 (patch)
tree27bd671e5d8089d0f612fe2e7c98eeaee1de9bbe /src/CRSMUtil.cpp
parent76c1fa19375b39630c180e0702c5be7b199e99d2 (diff)
downloadmanager-6cfb0e4b2bd7904c771914dd5030c54a2540e156.tar.gz
manager-6cfb0e4b2bd7904c771914dd5030c54a2540e156.zip
Move damerauLevenshteinDistance from qt-config's Util to CRSM's own Util
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];
+ }
+}