Как работает этот алгоритм, в особенности интересует 13,15,16,18 строки. Конечно ясно что он выводит номер последнего вхождения подстроки и количество таких вхождений. Но как он их обрабатывает? Что это за магический код? Уже второй день ищу как работают эти функции, но объяснение приведено для профессионалов.
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string stroke = "";
string substroke= "";
cin >> stroke;
cin >> substroke;
int j = 0; // позиция
size_t k = 0;
for (string::size_type i = 0; i < stroke.length(); ++i) {
j = j + 1; // номер позиции последнего вхождения
if (stroke[i] == substroke[0]) {
if (stroke.substr(i, substroke.length()) == substroke) {
k = k + 1; // кол-во вхождений
i += substroke.length() - 1;
}
}
}
cout << j << endl;
cout << k;
return 0;
}
Алгоритм идет из начала в конец исследуемой строки (условие цикла), пока не появится первая буква искомой подстроки (stroke[i] == substroke[0]
). Как только появилась - с этого места (i
) надеется найти слово (stroke.substr(i, substroke.length()) == substroke
), если находится - увеличивает счетчики и передвигается на его конец, откуда снова ищет первую букву..., иначе итерируется дальше в поисках буквы.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
От чего у меня выделяется память только для одного элемента?
Написал код для создания числовой пирамиды на N строк, где в каждой строке нумерация идет от 1 до N строки через пробелВсе компилируется и работает,...
Я не знаю баг это или фича, но Visual Studio C++ (VS 141) не подсвечивает ошибки если функция использует шаблонные параметры, да и вообще работает с шаблонном