Sprawdź się
W programie zdefiniowano zmienną slowo. Twoim zadaniem jest zbudowanie dla niej tablicy częściowych dopasowań metodą MP. W jednej linii wypisz tablicę dopasowań dla zmiennej, oddzielając jej elementy przecinkiem oraz spacją.
Przetestuj program dla zmiennej slowo = "tata".
Przypomnienie z poprzednich e‑materiałów:
W przeciwieństwie do metody KMP, metoda MP zakłada, że w momencie, gdy element występujący po znalezionym prefikso‑sufiksie będzie taki sam jak występujący po sufiksie, zamiast wpisywać wartość z tablicy na pozycji równej szerokości prefikso‑sufiksu, będziemy wpisywać do tablicy szerokość prefikso‑sufiksu.
Specyfikacja problemu:
Dane:
slowo– zmienna typu String
Wynik:
Program tworzy tablicę częściowych dopasowań metodą MP.
Przykładowe wyjście (slowo = "mama"):
-1, 0, 0, 1, 2public class Main {
static int[] budowaTablicyMP(String wzorzec) {
int rozmiarT = wzorzec.length() + 1;
int[] T = new int[rozmiarT];
int poz = -1;
T[0] = -1;
// dla każdego kolejnego prefiksu wzorca
for (int i = 1; i < rozmiarT; ++i) {
// dopóki możesz znaleźć dłuższy prefikso-sufiks
while(poz > -1 && wzorzec.charAt(poz) != wzorzec.charAt(i - 1)) {
poz = T[poz];
}
++poz;
// zapisz szerokość znalezionego prefikso-sufiksu
T[i] = poz;
}
return T;
}
public static void main(String[] args) {
String slowo = "tata";
int[] tablicaDopasowan = budowaTablicyMP(slowo);
for (int i = 0; i < tablicaDopasowan.length; ++i) {
System.out.print(tablicaDopasowan[i]);
if (i != tablicaDopasowan.length - 1) {
System.out.print(", ");
}
}
}
}W programie zdefiniowano tablicę zawierającą n słów. Twoim zadaniem jest zbudowanie dla nich tablic częściowych dopasowań metodą KMP. Dla każdego słowa wypisz w osobnej linii jego tablicę dopasowań, oddzielając jej elementy przecinkiem oraz spacją. Przetestuj działanie programu dla następującej tablicy:
String[] slowa = {
"algorytm",
"metoda",
"mama",
"kajak",
"joanna"
};Specyfikacja problemu:
Dane:
slowa– tablica składająca się znelementów (łańcuchów znaków)n– liczba naturalna dodatnia
Wynik:
Program tworzy tablicę częściowych dopasowań metodą KMP.
Przykładowe wyjście (slowa = {"cogito", "ergo", "sum", "carpe", "diem"):
-1, 0, 0, 0, 0, 0, 0
-1, 0, 0, 0, 0
-1, 0, 0, 0
-1, 0, 0, 0, 0, 0
-1, 0, 0, 0, 0public class Main {
static int[] budowaTablicyKMP(String wzorzec) {
int rozmiarT = wzorzec.length() + 1;
int[] T = new int[rozmiarT];
int poz = -1;
T[0] = -1;
// dla każdego kolejnego prefiksu wzorca
for (int i = 1; i < rozmiarT; ++i) {
// dopóki możesz znaleźć dłuższy prefikso-sufiks
while(poz > -1 && wzorzec.charAt(poz) != wzorzec.charAt(i - 1)) {
poz = T[poz];
}
++poz;
// jeżeli element występujący po znalezionym
// prefikso-sufiksie jest taki sam jak po prefiksie
if (i == rozmiarT - 1 || wzorzec.charAt(i) != wzorzec.charAt(poz)) {
// zapisz szerokość znalezionego prefikso-sufiksu
T[i] = poz;
}
else {
// kolejny element tablicy będzie tym samym,
// co element na pozycji równej szerokości
// prefikso-sufiksu
T[i] = T[poz];
}
}
return T;
}
public static void main(String[] args) {
String[] slowa = {
"algorytm",
"metoda",
"mama",
"kajak",
"joanna"
};
for (int i = 0; i < slowa.length; ++i) {
int[] tablicaDopasowan = budowaTablicyKMP(slowa[i]);
for (int j = 0; j < tablicaDopasowan.length; ++j) {
System.out.print(tablicaDopasowan[j]);
if (j != tablicaDopasowan.length - 1) {
System.out.print(", ");
}
}
System.out.print('\n');
}
}
}Do programu z ćwiczenia 2 dodano ciąg znaków: tekst. Korzystając z uprzednio utworzonych tablic częściowych dopasowań, sprawdź, które elementy tablicy slowa występują w łańcuchu znaków tekst. Dla każdego słowa w osobnej linii wypisz TAK, jeśli pojawia się w tekście lub NIE – w przeciwnym wypadku.
Specyfikacja problemu:
Dane:
slowa– tablica składająca się znelementów (łańcuchów znaków)n– liczba naturalna dodatniatekst– ciąg znaków o długości mm– liczba naturalna dodatnia
Wynik:
Program dla każdego słowa w osobnej linii wypisuje komunikat TAK lub NIE (w zależności od tego, czy pojawia się w tekście).
public class Main {
static int[] budowaTablicyKMP(String wzorzec) {
int rozmiarT = wzorzec.length() + 1;
int[] T = new int[rozmiarT];
int poz = -1;
T[0] = -1;
// dla każdego kolejnego prefiksu wzorca
for (int i = 1; i < rozmiarT; ++i) {
// dopóki możesz znaleźć dłuższy prefikso-sufiks
while(poz > -1 && wzorzec.charAt(poz) != wzorzec.charAt(i - 1)) {
poz = T[poz];
}
++poz;
// jeżeli element występujący po znalezionym
// prefikso-sufiksie jest taki sam jak po prefiksie
if (i == rozmiarT - 1 || wzorzec.charAt(i) != wzorzec.charAt(poz)) {
// zapisz szerokość znalezionego prefikso-sufiksu
T[i] = poz;
}
else {
// kolejny element tablicy będzie tym samym,
// co element na pozycji równej szerokości
// prefikso-sufiksu
T[i] = T[poz];
}
}
return T;
}
static int szukajWzorcaKMP(String wzorzec, String tekst) {
int[] tablicaDopasowan = budowaTablicyKMP(wzorzec);
int b = 0;
for (int i = 0; i < tekst.length(); ++i) {
while (b > -1 && wzorzec.charAt(b) != tekst.charAt(i)) {
b = tablicaDopasowan[b];
}
++b;
if (b == wzorzec.length()) {
return i - wzorzec.length() + 1;
}
}
return -1;
}
public static void main(String[] args) {
String[] slowa = {
"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.";
for (int i = 0; i < slowa.length; ++i) {
System.out.println(szukajWzorcaKMP(slowa[i], tekst) >= 0 ? "TAK" : "NIE");
}
}
}