Есть список:
var list = new List
Нужно удалить элементы, которые содержат в себе другие элементы. Т.е. удалить строки строка22у, строкайцвцйй, т.к. содержат первую строку и текстцвцй, текстыауке5 соответственно. В результате останутся строка, текст
Делаю так:
int removedCount;
do
{
removedCount = 0;
for (int i = 0; i < list.Count; i++)
{
removedCount += list.RemoveAll(x => x.Contains(list[i]) && x != list[i]);
}
} while (removedCount != 0);
Есть ли более эффективный способ?
Ответ
При большом количество строк (особенно если многие из них имеют одинаковые префиксы) вариант с построением префиксного дерева и поиску по нему должен работать гораздо быстрее. Однако и кода выходит гораздо больше.
Вариант реализации. Метод поиска требуемых строк:
private static List
Вспомогательный класс состояния ДКА с учетом оптимизации:
private class State
{
private Dictionary
public State get(char c)
{
if (firstState != null && firstChar == c)
{
return firstState;
}
if (firstState == null)
{
firstState = new State();
firstChar = c;
return firstState;
}
if (transitions == null)
{
transitions = new Dictionary
Комментариев нет:
Отправить комментарий