KMP

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 4

1. Написати програм који нам каже да ли се у датој реченици налази реч мачка.

#include <iostream>
#include <string>
using namespace std;

int main()
{
string recenica;
cout << "Uneti jednu recenicu: \n";
getline(cin,recenica);
if (recenica.find("macka") != string::npos)
cout << "Recenica sadrzi rec macka!";
else
cout << "Recenica ne sadrzi rec macka!";
}

2. Написати програм који исписује све делове у реченици које почињу словом а све до краја
реченице.
#include <iostream>
#include <string>
using namespace std;

int main()
{
//Unos recenice
string recenica;
cout << "Uneti jednu recenicu: \n";
getline(cin, recenica);
//Pronalazak svih delova recenice koje pocinju slovom a
int i = 0;
while ((i = recenica.find('a', i)) != string::npos)
{
// Ispisivanje podstringa
cout << recenica.substr(i)<<endl;
i++;
}
}

3. Написати програм којим се за две дате речи проверава да ли је друга садржана у првој, ако
јесте одредити прву позицију на којој се друга реч појављјује у првој.

Пример 1
Улаз
банана
ана
Излаз
1

Пример 2
Улаз
бранко
ана
Излаз
-1
I начин:
Можемо да искористимо готову методу и да прво појављивање нађемо помоћу библиотечне
методе find.

#include <iostream>
#include <string>
using namespace std;

int main()
{
//Ucitavamo reci
string prvarec;
string drugarec;
cout << "Uneti prvu rec: \n";
getline(cin, prvarec);
cout << "Uneti drugu rec: \n";
getline(cin, drugarec);
//Trazimo i ispisujemo poziciju pojavljivanja druge reci unutar prve
if (prvarec.find(drugarec) != string::npos)
cout << prvarec.find(drugarec);
else
cout << -1;
}

II начин:
Можемо да урадимо и „пешке“ алгоритам коришћењем грубе силе.
#include <iostream>
#include <string>
using namespace std;

int podniska(string s2, string s1)


{
// za svaku poziciju u reci s1 takvu da do kraja ima bar
// onoliko karaktera koliko ima u reci s2
for (int i = 0; i + s2.length() <= s1.length(); i++)
{
// Proveravamo da li se rec s2 nalazi u reci s1
// pocevsi od pozicije i. Brojac j uvecavamo dok ne
// dodjemo do kraja neke reci ili do prve razlike.
int j = 0;
while (j < s2.length() && s1[i + j] == s2[j])
j++;
// ako smo dosli do kraja reci s2, tada smo nasli njeno pojavljivanje
if (j == s2.length())
return i;
}
return -1;
}
int main()
{
// ucitavamo reci
string prvaRec, drugaRec;
cout << "Uneti prvu rec: \n";
getline(cin, prvaRec);
cout << "Uneti drugu rec: \n";
getline(cin, drugaRec);
// trazimo i ispisujemo poziciju pojavljivanja druge reci unutar prve
cout<<podniska(drugaRec, prvaRec);
}

III начин:
Овај проблем можемо решавати и много ефикаснијим специјализованим алгоритмом какав је
Кнут-Морис-Прат (КМП) алгоритам.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int KMP(string s2, string s1)


{
// kmp[i] je duzina najduzeg pravog prefiksa reci s2[0..i-1] koji je ujedno sufiks te reci
// pravimo tablicu
vector<int> kmp(s2.length() + 1);
kmp[0] = -1;
for (int d = 0; d < s2.length(); d++)
{
int k = d;
while (k > 0 && s2[d] != s2[kmp[k]])
k = kmp[k];
kmp[d + 1] = kmp[k] + 1;
}
// na osnovu konstruisane tablice vrsimo pretragu
int i = 0, j = 0;
while (i < s1.length())
if (s1[i] == s2[j])
{
i++; j++;
if (j == s2.length())
return i - s2.length();
}
else if (j == 0)
i++;
else
j = kmp[j];
return -1;
}

void main()
{
// ucitavamo reci
string prvaRec, drugaRec;
cout << "Uneti prvu rec: \n";
getline(cin, prvaRec);
cout << "Uneti drugu rec: \n";
getline(cin, drugaRec);
// trazimo i ispisujemo poziciju pojavljivanja druge reci unutar prve
cout<<KMP(drugaRec, prvaRec);
}
https://cmps-people.ok.ubc.ca/ylucet/DS/KnuthMorrisPratt.html

https://www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/

You might also like