#include <windows.h>
#include <string>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
system("chcp 1251 > nul"); // Руссификация сообщений
setlocale(LC_ALL, "Russian");
string s= "012345056056789";
string ss= "567";
string s0= "Подстрока не найдена";
size_t i=0; size_t i1=0; size_t is= s.length(); size_t iss= ss.length();
size_t flag= 0;
do
{
if(ss[i1]==s[i]) { cout << s[i1] << " = " << s[i] << endl; i++; i1++; flag++; }
else { cout << ss[i1] << " != " << s[i] << endl; i1=0; i++; flag=0; }
}while ( (i<(is-iss+1)) || (flag!=iss) );
cout << "Флаг=" << flag << "\ti= " << i << endl;
if(flag!=0) { s0=s.substr(i-iss,iss); }
cout << s0 << endl;
cout << endl << "Хелло Ворлд" << endl;
system("pause"); // system("pause > nul");
return 0;
}
string s= "01012"; //"5624245";
string ss="012"; // "245";
string s0= "Подстрока не найдена";
size_t i=0; size_t i1=0;
size_t is= s.length(); size_t iss= ss.length();
size_t flag= 0; int n;
do
{
if(ss[i1]!=s[i]) { cout << ss[i1] << " != " << s[i] << endl; n= 0; }
if(ss[i1]==s[i]){ cout << ss[i1] << " = " << s[i] << endl; n= 1; }
switch(n)
{
case 0: i1=0; if (!flag) {i++;} flag=0; break;
case 1: i1++; flag++; i++; break;
}
}while ( (i<is) || (flag!=iss) );
cout << "Флаг=" << flag << "\ti= " << i << endl;
if(flag!=0) { s0=s.substr(i-iss,iss); }
cout << s0 << endl;
Попробуй так. Что мы глупее академиков?
//string s= "01012";
string s= "56242452400";
//string ss="012";
string ss= "245";
string s0= "Подстрока не найдена";
size_t i=0; size_t i1=0;
size_t is= s.length(); size_t iss= ss.length();
size_t flag= 0;
for (i=0; i<(is-iss+1); i++)
{
i1=0;
do
{
if (s[i]==ss[i1]) { cout << s[i] << " = " << ss[i1] << endl; i1++; i++; flag++; }
if (s[i]!=ss[i1]) { cout << s[i] << " != " << ss[i1] << endl;
if (flag==iss) break;
if (flag!=0) { i--; } flag= 0; break; }
}while(i1<iss);
if (flag==iss) break;
}
if(flag==iss) { s0=s.substr(i-iss,iss); }
cout << s0 << endl;
cout << "i= " << i << endl;
string s= "01012";
string ss="012";
//string s= "56242452400";
//string ss= "245";
//string s= "0101012";
//string ss= "01012";
string s0= "Подстрока не найдена";
size_t i=0; size_t i1=0;
size_t is= s.length(); size_t iss= ss.length();
cout << "iss= " << iss << "\tis= " << is << endl;
size_t flag= 0; size_t i0;
for (i=0; i<is-1; i++)
{
i1=0; i0= i;
while(i1<iss)
{
if ( s[i0]==ss[i1] )
{ cout << s[i0] << " = " << ss[i1] << "\ti0= " << i0 << "\ti1= " << i1 << endl;
i1++; i0++; flag++; if
for (i = 0; i < is - iss + 1; ++i)
{
for(i1 = 0; i1 < iss && s[i+i1] == ss[i1]; ++i1) ;
if(i1 == iss)
{
s0 = s.substr(i, iss);
break;
}
}
Работает и в определённых ситуациях даже вполне годится. Но проблема в том, что никак не используется информация об уже произведённых сравнениях. Если эту информацию использовать, можно продвигаться по просматриваемой строке быстрее (вместо i+1 получить i+k). Вот и напридумывали всяких алгоритмов , как двигаться по строке быстрее.