Я предполагаю, что вы получили свои результаты в соответствии с примером, который вы связали.
StringSearchResult[] results = searchAlg.FindAll(textToSearch);
С этими results
, если вы предполагаете, что единственными перекрытиями являются подмножества, вы можете сортировать по индексу и собирать ваши желаемые результаты за один проход.
public class SearchResultComparer : IComparer<StringSearchResult> {
public int StringSearchResult(StringSearchResult x, StringSearchResult y)
{
// Try ordering by the start index.
int compare = x.Index.CompareTo(y.Index);
if (compare == 0)
{
// In case of ties, reverse order by keyword length.
compare = y.Keyword.Length.CompareTo(x.Keyword.Length);
}
return compare;
}
}
// ...
IComparer searchResultComparer = new SearchResultComparer();
Array.Sort(results, searchResultComparer);
int activeEndIndex = -1;
List<StringSearchResult> nonOverlappingResults = new List<StringSearchResult>();
foreach(StringSearchResult r in results)
{
if (r.Index < activeEndIndex)
{
// This range starts before the active range ends.
// Since it's an overlap, skip it.
continue;
}
// Save this result, track when it ends.
nonOverlappingResults.Add(r);
activeEndIndex = r.Index + r.Keyword.Length;
}
Благодаря сортировке индекса l oop гарантирует, что будут сохраняться только непересекающиеся диапазоны. Но некоторые диапазоны будут отклонены. Это может произойти только по двум причинам.
- Кандидат начинает с того же индекса, что и активный диапазон. Так как сортировка разрывает эти связи, поэтому самый длинный идет первым, кандидат должен быть короче активного диапазона и может быть пропущен.
- Кандидат стартует после активного диапазона. Поскольку единственными перекрытиями являются подмножества, и это перекрывается с активным диапазоном, это подмножество, которое начинается позже, но все еще заканчивается в или раньше.
Поэтому единственными отклоненными кандидатами будут подмножества, и они должны заканчиваться до активного диапазона. Таким образом, активный диапазон остается единственным, о чем нужно беспокоиться при перекрытии.