найти повторяющуюся подстроку в строке - PullRequest
0 голосов
/ 10 июля 2020

У меня есть подстрока

string subString = "ABC"; 

Каждый раз, когда все три символа появляются во вводе, вы получаете одну точку

, например, если ввод:

"AABKM" = 0 баллов
"AAKLMBDC" = 1 балл
"ABCC" = 1 балл, потому что все три встречаются один раз
"AAZBBCC" = 2 балла, потому что AB C повторяется дважды;
et c ..

Единственное решение, которое я мог придумать, это

Regex.Matches(input, "[ABC]").Count

Но не дает мне того, что я ищу.

Спасибо

Ответы [ 3 ]

5 голосов
/ 10 июля 2020

Вы можете использовать тернарную операцию, где сначала мы определяем, что все символы присутствуют в строке (в противном случае мы возвращаем 0), а затем выбираем только эти символы, группируем по каждому символу и возвращаем минимальное количество из группы:

Например:

string subString = "ABC";
var inputStrings = new[] {"AABKM", "AAKLMBDC", "ABCC", "AAZBBCC"};

foreach (var input in inputStrings)
{
    var result = subString.All(input.Contains)
        ? input
            .Where(subString.Contains)
            .GroupBy(c => c)
            .Min(g => g.Count())
        : 0;

    Console.WriteLine($"{input}: {result}");
}

Вывод

введите описание изображения здесь

2 голосов
/ 10 июля 2020

Это можно сделать одной строкой, используя Linq. Однако я не очень уверен, что это могло бы быть хорошим решением.

string subString = "ABC"; 
string input = "AAZBBBCCC";

var arr = input.ToCharArray()
               .Where(x => subString.Contains(x))
               .GroupBy(x => x)
               .OrderBy(a => a.Count())
               .First()
               .Count();

Результат - 2, потому что буква A присутствует только два раза.

Попробуем объяснить выражение linq. Сначала преобразуйте входную строку в последовательность символов, затем возьмите только те символы, которые содержатся в подстроке. Теперь сгруппируйте эти символы и отсортируйте их по количеству вхождений. На этом этапе возьмите первую группу и прочтите количество символов в этой группе.

Посмотрим, есть ли у кого-нибудь лучшее решение.

1 голос
/ 10 июля 2020

попробуйте этот код:

 string subString = "ABC";
        var input = new[] { "AABKM", "AAKLMBDC", "ABCC", "AAZBBCC" };

        foreach (var item in input)
        {
            List<int> a = new List<int>();
            for (int i = 0; i < subString.Length; i++)
            {
                a.Add(Regex.Matches(item, subString.ToList()[i].ToString()).Count);
            }
            Console.WriteLine($"{item} : {a.Min()}");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...