Задача на строки/подстроки..

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
Наська)
Сообщения: 3
Зарегистрирован: 18 мар 2010, 19:39

Задача на строки/подстроки..

Сообщение Наська) » 18 мар 2010, 20:15

Пыталась решить задачу никак(
Даны две строки и натуральное число К. Наёти К-е вхождение второй строки в первую.

помогите пожалуйста)

Аватара пользователя
rrrFer
Сообщения: 224
Зарегистрирован: 07 сен 2008, 13:15
Контактная информация:

Re: Задача на строки/подстроки..

Сообщение rrrFer » 18 мар 2010, 21:05

Код: Выделить всё

#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

Наська)
Сообщения: 3
Зарегистрирован: 18 мар 2010, 19:39

Re: Задача на строки/подстроки..

Сообщение Наська) » 18 мар 2010, 21:13

спасибо) сейчас буду разбираться)

Аватара пользователя
rrrFer
Сообщения: 224
Зарегистрирован: 07 сен 2008, 13:15
Контактная информация:

Re: Задача на строки/подстроки..

Сообщение rrrFer » 18 мар 2010, 22:13

Код: Выделить всё

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-того вхождения - предыдущий код был после вхождения.
Первое условие выполняется при некорректном k
второе если найдено очередное вхождение
третье если первая строка кончилась
четвертое если очередной символ строк совпадает
Если ни одно условие не выполнилось - переходим к следующему символу - для этого считали длину последней не совпавшей последовательности(Lastlen)
Если выполнилось первое условие - вернем всю строку целиком - можно вернуть сообщение об ошибке
Если второе то надо уменьшить количество вхождений, которые осталось найти и перейти на следующий символ в обеих строках без отката назад на длину последней последовательности, т.к. последовательности совпали полностью
Если третье - значит, в первой строке нет достаточного количества вхождений второй строки - возвращаем пустую строку
Ну и если четвертое - переходим на следующий символ во всех последовательностях
Приглашаю на свой блог о программировании: pro-prof.com

Наська)
Сообщения: 3
Зарегистрирован: 18 мар 2010, 19:39

Re: Задача на строки/подстроки..

Сообщение Наська) » 18 мар 2010, 22:38

ого, блин,а проще кода нет?

спасиб большое, за эти)

licenok
Сообщения: 14
Зарегистрирован: 25 авг 2010, 16:08

Re: Задача на строки/подстроки..

Сообщение licenok » 26 авг 2010, 16:23

Код: Выделить всё

// с использованием 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;

//всё :)

Ответить