Пыталась решить задачу никак(
Даны две строки и натуральное число К. Наёти К-е вхождение второй строки в первую.
помогите пожалуйста)
Задача на строки/подстроки..
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Код: Выделить всё
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
char* f(char *s, char *s0, int k, int pos, int pos0,int lastlen){
if(!k)
return &s[pos];
if(!s0[pos0])
return f(s,s0,k-1,pos,pos0+1,0);
if(!s[pos])
return "";
if(s0[pos0]==s[pos])
return f(s,s0,k,pos+1,pos0+1,lastlen+1);
return f(s,s0,k,pos-lastlen+1,0,0);
}
int main(){
cout<<f("adsadfgasdhsasdert","asd",2,0,0,0)<<endl;
cout<<f("adsadfgasdhsasdert","asd",1,0,0,0)<<endl;
cout<<f("adsadfgasdhsasdert","asd",0,0,0,0)<<endl;
cout<<endl<<"press any key to continue: "<<endl;
cin.get();
return 0;
}
Приглашаю на свой блог о программировании: pro-prof.com
спасибо) сейчас буду разбираться)
Код: Выделить всё
char* f(char *s, char *s0, int k, int pos, int pos0,int lastlen){
if(k<=0)
return &s[0];
if(!s0[pos0])
return k==1?&s[pos-lastlen]:f(s,s0,k-1,pos,pos0+1,0);
if(!s[pos])
return "";
if(s0[pos0]==s[pos])
return f(s,s0,k,pos+1,pos0+1,lastlen+1);
return f(s,s0,k,pos-lastlen+1,0,0);
}
Первое условие выполняется при некорректном k
второе если найдено очередное вхождение
третье если первая строка кончилась
четвертое если очередной символ строк совпадает
Если ни одно условие не выполнилось - переходим к следующему символу - для этого считали длину последней не совпавшей последовательности(Lastlen)
Если выполнилось первое условие - вернем всю строку целиком - можно вернуть сообщение об ошибке
Если второе то надо уменьшить количество вхождений, которые осталось найти и перейти на следующий символ в обеих строках без отката назад на длину последней последовательности, т.к. последовательности совпали полностью
Если третье - значит, в первой строке нет достаточного количества вхождений второй строки - возвращаем пустую строку
Ну и если четвертое - переходим на следующий символ во всех последовательностях
Приглашаю на свой блог о программировании: pro-prof.com
ого, блин,а проще кода нет?
спасиб большое, за эти)
спасиб большое, за эти)
Код: Выделить всё
// с использованием MFC
CString first;
CString second;
int k;
k = 5; //например 5
// предполагается что строки first и second введены заранее
int count = 0;
int itogpos = 0;
int pos;
while ((pos = first.Find(second)) != -1)
{
count++;
itogpos += pos;
if (count == k) return itogpos;
first = first.Mid(pos);
}
return -1;
//всё :)