Satya Prakash Swain Ответов: 3

Найдите количество вхождений "АА "в"саааб".


Find the number of occurances of "aa" in "caaab".
Ответ должен быть 2.

Что я уже пробовал:

string str = d;
                            for (int number = 0; number < d.Length - genes[i].Length; number++)
                            {
                                var compstr = d.Substring(number, genes[i].Length).ToString();
                                str = d.Substring(1);
                                if (compstr == genes[i])
                                {
                                    count++;
                                }
                            }

W∴ Balboos, GHB

Звучит как домашнее задание.

londhess

Попробуйте что-нибудь вроде этого.
int count = new string (str.Select ((c, index) => str.Подстрока (индекс).TakeWhile (e => e = = c))
.OrderByDescending(е =&ГТ; электронная.Граф())
.Первый().Метод toArray()).Функция count()-1;

3 Ответов

Рейтинг:
21

Pete O'Hanlon

Это простая задача для работы, но я удивляюсь простой оптимизации, которую люди упускают в подобных задачах. Давайте сначала взглянем на код:

for (int index = 0; index < input.Length - 1; index++)
{
  if (input.Substring(index, 2) == "aa")
  {
    count++;
  }
}
И вот оно-простое решение простой задачи. Однако заметили ли вы проблему оптимизации? Мы знаем, что длина нашей тестовой строки равна 2, поэтому последнее место, где может начаться совпадение, - это предпоследняя буква; отсюда и причина, по которой мы снимаем 1 С длины. Если бы текст, который мы пытались сопоставить, состоял из трех символов, мы бы сняли 2 с длины и так далее.


Рейтинг:
2

Karthik_Mahalingam

string  input = "caaabaaaa";
string find = "aa";
int count = 0;

for (int i = 0; i < input.Length; i++)
{
    if (  i + find.Length <=input.Length) // validate to avoid index error
    {
        var str = input.Substring(i, find.Length);
        if (str == find)
        {
            count++;
        }
    }
}
Console.WriteLine(count); //2


Рейтинг:
0

RickZeeland

Я думаю, что ответ должен быть 1, Вот хороший пример: [dotnetperls]


Pete O'Hanlon

Нет, он прав. Их должно быть двое. Там три " а " вместе, значит, должно быть два вместе. В слове caaab первый aa начинается с индекса 1, а второй aa начинается с индекса 2.

RickZeeland

Это вопрос мнения, я думаю, если вы позволяете перекрывать строки, вы правы.
Может быть, небольшой пример, скажем, у меня есть две строки и добавьте их: "nono" + "nono", тогда сколько nono вы получаете ?

RickZeeland

Людям, которые не оставляют комментариев, я хотел бы сказать следующее: Просто используйте текстовый редактор и попробуйте найти " aa "в строке "caaab".
Как вы думаете, каким будет результат ?

Satya Prakash Swain

Поначалу я тоже столкнулся с этим. Пожалуйста, взгляните на эту статью для поиска паттернов. http://www.geeksforgeeks.org/searching-for-patterns-set-2-kmp-algorithm/

RickZeeland

Глядя на статью, в которой вы с Питом правы, я все же нахожу странным, что на практике, например, используя Notepad++ или пример Dotnetperls, Результаты поиска отличаются.