using System.Collections.Generic;
private const int THRESHOLD = 10;
public static void Main(string[] args)
List<PotentialPair> potentialPairs = new List<PotentialPair>
new PotentialPair { CaseId = "1", Mpn1 = "1110521-WHT-11", Mpn2 = "1110521-WHT-07", Mpn3 = "1110521-WHT-12" },
new PotentialPair { CaseId = "2", Mpn1 = "3583788033422", Mpn2 = "3583788033316", Mpn3 = "3583788033399" },
new PotentialPair { CaseId = "3", Mpn1 = "358345445035125", Mpn2 = "5688585", Mpn3 = "2254546" },
new PotentialPair { CaseId = "4", Mpn1 = "WSSE32-B2", Mpn2 = "WSSE32-W2", Mpn3 = "WSSE32-X2" },
new PotentialPair { CaseId = "5", Mpn1 = "BWR810PURP", Mpn2 = "BWR810PINK", Mpn3 = "BWR810BLACK" },
new PotentialPair { CaseId = "6", Mpn1 = "WSSE32-B2", Mpn2 = "WSSE32-W2", Mpn3 = "WSSE32-W5" },
new PotentialPair { CaseId = "7", Mpn1 = "5054773660089", Mpn2 = "5054773660058", Mpn3 = "5054773660088" },
new PotentialPair { CaseId = "8", Mpn1 = "SMT-UTC-YL", Mpn2 = "SMT-UTC-PK", Mpn3 = "SMT-UTC-WH" },
new PotentialPair { CaseId = "9", Mpn1 = "4x SMT-V34", Mpn2 = "2x SMT-V34", Mpn3 = "3x SMT-V34" },
new PotentialPair { CaseId = "10", Mpn1 = "MU-PC1T0H/WW", Mpn2 = "MU-PC1T0T/WW", Mpn3 = "MU-PC1T0R/WW" },
PopulateGroupIds(potentialPairs);
foreach (var pair in potentialPairs)
Console.WriteLine("Potential groupId for case id: " + pair.CaseId + " -> GroupId: " + pair.GroupId);
public static void PopulateGroupIds(List<PotentialPair> pairs)
foreach (PotentialPair pair in pairs)
string groupId = FindGroupId(pair.Mpn1, pair.Mpn2, pair.Mpn3);
public static string FindGroupId(string mpn1, string mpn2, string mpn3)
int distance1 = LevenshteinDistance(mpn1, mpn2);
int distance2 = LevenshteinDistance(mpn1, mpn3);
int distance3 = LevenshteinDistance(mpn2, mpn3);
int minDistance = Math.Min(distance1 + distance2, Math.Min(distance1 + distance3, distance2 + distance3));
if (minDistance > THRESHOLD)
string groupCandidate = mpn1;
if (distance2 + distance3 < distance1)
else if (distance3 + distance1 < distance2)
public static int LevenshteinDistance(string s, string t)
int[,] d = new int[s.Length + 1, t.Length + 1];
for (int i = 0; i <= s.Length; i++)
for (int j = 0; j <= t.Length; j++)
for (int j = 1; j <= t.Length; j++)
for (int i = 1; i <= s.Length; i++)
int cost = (s[i - 1] == t[j - 1]) ? 0 : 1;
d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost);
return d[s.Length, t.Length];
public class PotentialPair
public string CaseId { get; set; }
public string Mpn1 { get; set; }
public string Mpn2 { get; set; }
public string Mpn3 { get; set; }
public string GroupId { get; set; }