Estuve consultando con ChatGTP y me sugirió que lo podemos hacer utilizando el algoritmo de Levenshtein, incluso nos dio un ejemplo para usarlo con PHP y Python. Le pregunte si lo podíamos hacer con xharbour/harbour y me dice que no hay una librería que lo tenga, pero que podemos hacer el algoritmo en C++, ya que xharbour esta basado en clipper, que a su vez esta basado en c++.
Buscando en Google encontré el mencionado algoritmo escrito en C++.
- Code: Select all Expand view
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int levenshtein(const string &s1, const string &s2)
{
int N1 = s1.size();
int N2 = s2.size();
int i, j;
vector<int> T(N2+1);
for ( i = 0; i <= N2; i++ )
T[i] = i;
for ( i = 0; i < N1; i++ )
{
T[0] = i+1;
int corner = i;
for ( j = 0; j < N2; j++ )
{
int upper = T[j+1];
if ( s1[i] == s2[j] )
T[j+1] = corner;
else
T[j+1] = min(T[j], min(upper, corner)) + 1;
corner = upper;
}
}
return T[N2];
}
https://es.wikipedia.org/wiki/Distancia_de_Levenshtein
De casualidad alguno de los master, nos puede ayudar a traducir ese algoritmo para xharbour/harbour?
ChatGTP nos sugirió este código para hacerlo. Pero salen varios errores.
- Code: Select all Expand view
//Algoritmo de Levenshtein
FUNCTION LevenshteinDistance(s1, s2)
LOCAL m, n, matriz, i, j, coste
m := Len(s1)
n := Len(s2)
matriz := Array(m+1, n+1)
FOR i := 0 TO m
matriz[i][0] := i
NEXT
FOR j := 0 TO n
matriz[0][j] := j
NEXT
FOR i := 1 TO m
FOR j := 1 TO n
IF s1[i] <> s2[j]
coste := 1
ELSE
coste := 0
ENDIF
matriz[i][j] := Min(matriz[i-1][j] + 1, matriz[i][j-1] + 1, matriz[i-1][j-1] + coste)
NEXT j
NEXT i
RETURN matriz[m][n]
Error E0021 Incorrect number of arguments: MIN
De antemano gracias