Объясните как это работает

int q;

void count(string s, string l)
{
int pos, k = 0;
while (s.find(l) ! = -1)
{
pos = s.find(l) + 1;
k++;
s = s.substr(pos);
}
q = k;
}

void solve()
{
task("str41");
string s, l;
pt > > s > > l;
count(s, l);
pt < < q;
}​

али393 али393    2   15.11.2019 09:38    0

Ответы
Filindenis Filindenis  10.10.2020 13:23

Объяснение:

Это весьма неэффективный алгоритм вычисления количества подстрок l в строке s. Работает так:

1) Функция find ищет первое вхождение строки l в строку s: индекс начала вхождения pos. Например, s = "xxxabdcabd", l = "abd". Сделаем так:

int pos = s.find(l);

Первым вхождением строки l в строку s является выделенная часть: "xxxabdcabd". В переменной pos будет храниться индекс буквы a, то есть 3.

Если вхождения нет, то в pos будет находиться -1.

2) Если вхождение есть, то увеличиваем счетчик подстрок. Теперь нам нужно искать подстроку l в строке s, начиная с позиции pos+1. Для этого в коде исходная строка обрезается с функции substr. Была "xxxabdcabd", стала "bdcabd".

Пример: s = s.substr(3+1);

Теперь в строке s удалены символы с индексами от 0 до 3 включительно.

Далее снова ищем первое вхождение строки l в уже новой строке s:

"bdcabd". Увеличиваем счетчик, снова обрезаем строку. Теперь s = "bd".

Снова попытаемся найти первое вхождение строки "abd" в уже строку "bd". Вхождения нет, s.find(l) == -1, завершаем цикл.

ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика