Матч 349, Поиск документа (DocumentSearch)

Дивизион 2, Уровень 1

 

Необходимо определить, сколько раз заданное слово или выражение встречается в тексте. При этом не следует подсчитывать перекрывающиеся встречи. Например, в тексте "abababa", слово "ababa" встречается с нулевой и со второй позиции. Поэтому при подсчете следует учитывать только одну из этих встреч, так как они перекрываются.

Сначала следует найти конкатенацию всех строк в массиве doc. Затем найти в нем количество неперекрывающихся встреч слова search.

 

Класс: DocumentSearch

Метод: int nonIntersecting(vector<string> doc, string search)

Ограничения: doc содержит от 1 до 50 элементов, doc[i] и search содержит от 1 до 50 символов ‘a’ – ‘z’ и пробелов.

 

Вход. Массив строк doc.

 

Выход. Количество раз, которое встречается в тексте слово search. Перекрывающиеся встречи слова search не учитывать.

 

Пример входа

doc

search

{ababababa}

ababa

{ababababa}

aba

{aaa,aa,a,a}

“aa”

 

Пример выхода

1

2

3

 

 

РЕШЕНИЕ

обработка строк

 

Совершим конкатенацию всех строк из массива doc в строку s. Ищем первую позицию pos, с которой встречается слово search в тексте s. Удаляем из s подстроку с нулевого по pos + search.size() - ый символ. Подсчитываем количество удалений в переменной c. Повторяем процесс поиска и удаления, пока s содержит в себе search.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

using namespace std;

 

class DocumentSearch

{

public:

  int nonIntersecting(vector<string> doc, string search)

  {

    string s;

    int i, pos, c;

    for(i = c = 0; i < doc.size(); i++) s = s + doc[i];

    while((pos = s.find(search)) >= 0)

      s.erase(0,pos + search.size()), c++;

    return c;

  }

};