public static int Calculate(string input1, string input2)
if (input1.Length == 0 || input2.Length == 0)
return (int)Math.Round(100 * Levenshtein.GetRatio(input1, input2));
public static void Main()
Console.WriteLine(Calculate("FuzzyWuzzy is a lifesaver!".ToLower(), "fuzzy wuzzy is a LIFE SAVER.".ToLower()));
public static class Levenshtein
public static double GetRatio(string s1, string s2)
return GetRatio(s1.ToCharArray(), s2.ToCharArray());
public static double GetRatio<T>(T[] input1, T[] input2) where T : IEquatable<T>
int len1 = input1.Length;
int len2 = input2.Length;
int lensum = len1 + len2;
int editDistance = EditDistance(input1, input2, 1);
return editDistance == 0 ? 1 : (lensum - editDistance) / (double)lensum;
public static int EditDistance<T>(T[] c1, T[] c2, int xcost = 0) where T: IEquatable<T>
while (len1 > 0 && len2 > 0 && c1[str1].Equals(c2[str2]))
while (len1 > 0 && len2 > 0 && c1[str1 + len1 - 1].Equals(c2[str2 + len2 - 1]))
return len2 + 1 - 2 * Memchr(c2, str2, c1[str1], len2);
return len2 - Memchr(c2, str2, c1[str1], len2);
int[] row = new int[len2];
for (i = 0; i < len2 - (xcost != 0 ? 0 : half); i++)
for (i = 1; i < len1; i++)
T ch1 = c1[str1 + i - 1];
if (ch1.Equals(c2[c2p++]))
row[0] = len1 - half - 1;
for (i = 1; i < len1; i++)
T ch1 = c1[str1 + i - 1];
int offset = i - (len1 - half);
c3 = row[p++] + (!ch1.Equals(c2[c2p++]) ? 1 : 0);
end = len2 + i - half - 2;
int c3 = --D + (!ch1.Equals(c2[c2p++]) ? 1 : 0);
int c3 = --D + (!ch1.Equals(c2[c2p]) ? 1 : 0);
private static int Memchr<T>(T[] haystack, int offset, T needle, int num) where T : IEquatable<T>
if (haystack[offset + p].Equals(needle))