Поиск фразы в массиве слов

Весь мозг сломал, ничего в голове не приходит, как это реализовать программно на C#.


Ответы (2 шт):

Автор решения: Pavel Popov

Ну, примерно так. Можно еще добавить фильтр на дубликаты, но это уже сами :-)

        var pattern = "Автоматические ворота";
        var phrases = new []{ "Автоматические ворота", "автоматические ворота купить", "Автоматические ворота каталог всех", "Автоматические подъемные ворота","просто ворота" };
        var patternWords = pattern.Split(' ');

        var tempResult = phrases.Where(x => patternWords.All(p => x.Contains(p, StringComparison.OrdinalIgnoreCase)))
            .ToArray();

        Console.Write($"{pattern}");
        foreach (var phrase in tempResult)
        {
           var words = phrase.Split(' ')
               .Where(x => !patternWords.Any(p => x.Contains(p, StringComparison.OrdinalIgnoreCase)))
               .ToArray();

           if(!words.Any())
               continue;

           Console.Write($", {string.Join(", ", words)}");
        }
→ Ссылка
Автор решения: tym32167

разбиваем на токены, пару раз группируем, получаем

string str = @"
Автоматические ворота
Автоматические ворота купить
Автоматические ворота каталог
Автоматические ворота цена
Где купить автоматические ворота
Автоматические гаражные ворота
Автоматические подъемные ворота
";

var lines = str.Split(new[] { Environment.NewLine },
    StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray();

var linesByTokens = lines
    .ToDictionary(x => x,
        x => new HashSet<string>(x.ToLower().Split(new[] { " " },
            StringSplitOptions.RemoveEmptyEntries)));


var tokensCount = linesByTokens.Values
    .SelectMany(x => x).GroupBy(x => x)
    .ToDictionary(x => x.Key, x => x.Count());

var topLine = linesByTokens
    .Where(x => x.Value.All(t => tokensCount[t] == lines.Length))
    .FirstOrDefault();

foreach (var line in lines)
{
    if (string.Compare(line, topLine.Key) == 0)
        Console.WriteLine($"{line}, {string.Join(", ", tokensCount.Keys.Except(linesByTokens[line]))}");
    else Console.WriteLine(line);
}

Вывод

Автоматические ворота, купить, каталог, цена, где, гаражные, подъемные
Автоматические ворота купить
Автоматические ворота каталог
Автоматические ворота цена
Где купить автоматические ворота
Автоматические гаражные ворота
Автоматические подъемные ворота
→ Ссылка