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); }