예제 #1
0
        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]);
        }
예제 #2
0
        /// <summary>
        /// Получить общую подстроку двух строк, лучшую по некоторой функции расстояния между ними
        /// </summary>
        /// <param name="string1">Первая строка</param>
        /// <param name="string2">Вторая строка</param>
        /// <param name="norm">Норма подстроки: чем меньше её результат - тем лучше подстрока</param>
        /// <param name="cutIntermediateResults">Можно ли отбрасывать промежуточные неоптимальные результаты. Устанавливать в true, если для любых s1, s2, s: norm(s1) &lt; norm(s2) => norm(s1 + s) &lt; 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));
        }