Ejemplo n.º 1
0
        public int[] Match(IReadOnlyList <string> pattern, IReadOnlyList <string> search)
        {
            if (search.Count < pattern.Count)
            {
                var rMatch = Match(search, pattern);
                var nMatch = new int[pattern.Count];
                for (int i = 0; i < nMatch.Length; i++)
                {
                    nMatch[i] = -1;
                }

                for (int i = 0; i < rMatch.Length; i++)
                {
                    if (rMatch[i] >= 0)
                    {
                        nMatch[rMatch[i]] = i;
                    }
                }

                return(nMatch);
            }

            if (pattern.Count == 0)
            {
                return(new int[0]);
            }

            float bestScore = MinMatchScore;

            int[] bestMatch = null;

            var mm = new MatchMatrix(pattern, search, MaxMatchOffset);

            for (int i = mm.WorkingRange.first; mm.Match(i, out float score); i++)
            {
                if (score > bestScore)
                {
                    bestScore = score;
                    bestMatch = mm.Path();
                }
            }

            if (bestMatch == null)
            {
                return(Enumerable.Repeat(-1, pattern.Count).ToArray());
            }

            return(bestMatch);
        }