internal static Equality BestCommonSubStringEquality(string string1, string string2, StringNorm norm, bool cutIntermediateResults) { var currentRow = new Equality[string2.Length + 1]; for (int j = 0; j <= string2.Length; j++) { currentRow[j] = new Equality(); } for (int i = 1; i <= string1.Length; i++) { Equality[] nextRow = new Equality[string2.Length + 1]; nextRow[0] = new Equality(); for (int j = 1; j <= string2.Length; j++) { nextRow[j] = new Equality(); if (string1[i - 1] == string2[j - 1]) { nextRow[j].Append(currentRow[j - 1], i - 1, j - 1); } else { nextRow[j].JoinTop(currentRow[j]); nextRow[j].JoinLeft(nextRow[j - 1]); } if (cutIntermediateResults) { nextRow[j].LeaveOnlyBest(string1, string2, norm); } } currentRow = nextRow; } return(currentRow[string2.Length]); }
/// <summary> /// Получить общую подстроку двух строк, лучшую по некоторой функции расстояния между ними /// </summary> /// <param name="string1">Первая строка</param> /// <param name="string2">Вторая строка</param> /// <param name="norm">Норма подстроки: чем меньше её результат - тем лучше подстрока</param> /// <param name="cutIntermediateResults">Можно ли отбрасывать промежуточные неоптимальные результаты. Устанавливать в true, если для любых s1, s2, s: norm(s1) < norm(s2) => norm(s1 + s) < norm(s2 + s)</param> /// <returns>Набор совпадений, определяющий лучшую общую подстроку максимально возможной длины</returns> public static Point[] BestCommonMatch(string string1, string string2, StringNorm norm, bool cutIntermediateResults) { var equality = BestCommonSubStringEquality(string1, string2, norm, cutIntermediateResults); return(equality.BestEquality(string1, string2, norm)); }