Actualmente estoy buscando un algoritmo simple y ligero para comparar dos cadenas simples.Algoritmo de diferencia de palabra simple
Por ejemplo, si tomamos esos dos cadenas:
- "El rápido zorro marrón salta sobre el perro perezoso"
- "El zorro marrón plick tumps sobre el perro loco"
Debería indicarme que las 2 primeras letras de la segunda palabra son diferentes, etc.
Por ahora tengo un algoritmo muy simple que compara palabras:
/// <summary>
/// Make a diff between two strings and returns words indices
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static List<int> Diff(string a, string b)
{
List<int> indices = new List<int>();
string[] asplit = a.Split(' ');
string[] bsplit = b.Split(' ');
for (int i = 0; i < asplit.Length; i++)
{
if (bsplit.Length > i)
{
if (asplit[i].CompareTo(bsplit[i]) != 0)
{
indices.Add(i);
}
}
}
return indices;
}
Así que esto me va a decir qué palabras (usando un espacio dividido en caracteres) son diferentes.
He leído muchos temas aquí sobre la implementación de algoritmos complejos o el uso de una biblioteca existente.
Pero estoy entrenado por .NET compact framework (WP7) y no quiero algo que pueda comparar dos archivos o dos textos, solo necesito una comparación de palabras.
¿Hay alguna biblioteca o algoritmo que pueda caber? Gracias :).
¿Qué sucede si una palabra se inserta en el medio de una de las oraciones, por lo que sesga la coincidencia? ¿Debería informar cada palabra siguiente diferente? –
La forma estándar de resolver este problema es implementar el algoritmo de subsecuencia común más larga. Es un algoritmo bastante directo. Tengo una implementación de JScript aquí: http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx convirtiéndolo en C# se deja como un ejercicio. –
@James Michael Hare: digamos que tengo "mi pequeño pony" y "mi dulce pequeño pony", solo debería informar "dulce". Creo que mi algoritmo demasiado simple falla para esto. – Valryon