Sprawdź się
Napisz program, który obliczy i wyświetli tablicę prefikso‑sufiksów dla podanego wzorca. Swój algorytm przetestuj dla wzorca "AOAGDNMAOAGUIO".
Specyfikacja:
Dane:
tekst– wzorzec dla którego należy znaleźć tablicę prefikso‑sufiksów; ciąg znaków
Wynik:
Program wyświetla na wyjściu standardowym zawartość tablicaPrefiksoSufiksow - tablicy prefikso‑sufiksów dla podanego wzorca.
Przykładowe rozwiązanie zadania:
#include <iostream>
using namespace std;
void generujTablicePrefiksoSufiksow(string wzorzec, int tablicaPrefiksoSufiksow[]) {
int j = 0;
int i = 1;
tablicaPrefiksoSufiksow[0] = 0;
while (i < wzorzec.size()) {
if (wzorzec[i] == wzorzec[j]) {
j++;
tablicaPrefiksoSufiksow[i] = j;
i++;
} else {
if (j != 0) {
j = tablicaPrefiksoSufiksow[j - 1];
} else {
tablicaPrefiksoSufiksow[i] = j;
i++;
}
}
}
}
int main() {
string tekst = "AOAGDNMAOAGUIO";
int tablicaPrefiksoSufiksow[tekst.size()] = {};
generujTablicePrefiksoSufiksow(tekst, tablicaPrefiksoSufiksow);
for (int i = 0; i < tekst.size(); i++) {
cout << tablicaPrefiksoSufiksow[i] << " ";
}
return 0;
}Napisz program, który wyświetli wszystkie pozycje, na których został znaleziony podany wzorzec w tekście. Użyj algorytmu KMP. Swoje rozwiązanie przetestuj dla napisu "AOAGDNMAOAGUIO" i wzorca "AOAG".
Specyfikacja:
Dane:
napis– tekst do przeszukania; ciąg znakówwzorzec– wzorzec, który należy odnaleźć; ciąg znaków
Wynik:
Program wypisuje na standardowe wyjście wszystkie indeksy w tablicy napis od których rozpoczyna się wzorzec z tablicy wzorzec, oddzielone spacjami.
Przykładowe rozwiązanie zadania:
#include <iostream>
using namespace std;
void generujTablicePrefiksoSufiksow(string wzorzec, int tablicaPrefiksoSufiksow[]) {
int j = 0;
int i = 1;
tablicaPrefiksoSufiksow[0] = 0;
while (i < wzorzec.size()) {
if (wzorzec[i] == wzorzec[j]) {
j++;
tablicaPrefiksoSufiksow[i] = j;
i++;
} else {
if (j != 0) {
j = tablicaPrefiksoSufiksow[j - 1];
} else {
tablicaPrefiksoSufiksow[i] = j;
i++;
}
}
}
}
void wyszukajKMP(string wzorzec, string napis) {
int tablicaPrefiksoSufiksow[wzorzec.size()] = {};
generujTablicePrefiksoSufiksow(wzorzec, tablicaPrefiksoSufiksow);
int i = 0, j = 0;
while (i < napis.size()) {
if (wzorzec[j] == napis[i]) {
j++; i++;
}
if (j == wzorzec.size()) {
cout << (i - j) << " ";
j = tablicaPrefiksoSufiksow[j - 1];
}
else if (i < napis.size() && wzorzec[j] != napis[i]) {
if (j != 0) {
j = tablicaPrefiksoSufiksow[j - 1];
} else {
i++;
}
}
}
}
int main() {
string napis = "AOAGDNMAOAGUIO";
string wzorzec = "AOAG";
wyszukajKMP(wzorzec, napis);
return 0;
}Napisz program, który sprawdzi, czy słowa - elementy tablicy slowa - występują w podanym ciągu znaków tekst. Dla każdego słowa wypisz w osobnej linii TAK, jeśli występuje w tekście choć raz, lub NIE w przeciwnym wypadku.
Specyfikacja:
Dane:
tekst– tekst do przeszukania; ciąg znakówslowa– tablica wzorców, dla których należy określić czy występują w tekście co najmniej raz czy też nie; tablica ciągów znaków
Wynik:
Dla każdego elementu tablicy slowa, program wypisuje na standardowe wyjście TAK, jeżeli występuje ono w tekście w zmienniej tekst co najmniej raz lub NIE, w przeciwnym razie.
#include <iostream>
using namespace std;
void generujTablicePrefiksoSufiksow(string wzorzec, int tablicaPrefiksoSufiksow[]) {
int j = 0;
int i = 1;
tablicaPrefiksoSufiksow[0] = 0;
while (i < wzorzec.size()) {
if (wzorzec[i] == wzorzec[j]) {
j++;
tablicaPrefiksoSufiksow[i] = j;
i++;
} else {
if (j != 0) {
j = tablicaPrefiksoSufiksow[j - 1];
} else {
tablicaPrefiksoSufiksow[i] = j;
i++;
}
}
}
}
int wyszukajKMP(string wzorzec, string napis) {
int tablicaPrefiksoSufiksow[wzorzec.size()] = {};
generujTablicePrefiksoSufiksow(wzorzec, tablicaPrefiksoSufiksow);
int i = 0, j = 0;
while (i < napis.size()) {
if (wzorzec[j] == napis[i]) {
j++; i++;
}
if (j == wzorzec.size()) {
// Funkcja zwraca pierwszy napotkany indeks
return (i - j);
j = tablicaPrefiksoSufiksow[j - 1];
}
else if (i < napis.size() && wzorzec[j] != napis[i]) {
if (j != 0) {
j = tablicaPrefiksoSufiksow[j - 1];
} else {
i++;
}
}
}
return -1;
}
int main() {
string slowa[5] = {
"algorytm",
"metoda",
"mama",
"kajak",
"joanna"
};
string tekst = "Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, joanna ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum metoda volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam mama consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.";
int rezultat = 0;
for (int i = 0; i < 5; i++) {
rezultat = wyszukajKMP(slowa[i], tekst);
if (rezultat >= 0) {
cout << "TAK" << endl;
} else {
cout << "NIE" << endl;
}
}
return 0;
}