Cześć razem z grupką znajomych, mamy problem potrzebujemy napisać program który będzie wypisywać część wspólne z ciągów znaków.
Powiedzmy mamy ciągi:
1: AABABB
2: BAABAB
Części wspólne to:
"AA" "AAB" BA" itd...
Musimy wypisać wszystkie. Mamy kilka kodów, potrzebujemy to na zajęcia z algorytmiki, ciężko nam idzie... także nie ukrywam, że jesteśmy słabi.
Studia zaocznie + praca + inne przedmioty = bardzo mało czasu co przy kiepskich wykładach, właśnie tym owocuje.
Mamy to:
package Czesc;
public class Czesc {
public static void main(String[] args) {
String tekst1 = "AABABB";
String tekst2 = "BAABAB";
int dl1 = tekst1.length();
int dl2 = tekst2.length();
int maksimum = 0;
int poz_w1 = -1;
int poz_w2 = -1;
for (int i = 0; i < dl1 - maksimum; i++)
{
for (int k = dl2 - 1; k >= 0; k--)
{
int licznik = 0;
int limit = Math.min(dl2, (dl1 -i + k) );
for (int j = k; j < limit; j++)
{
if (tekst1.charAt(i+j-k) == tekst2.charAt(j))
{
licznik++;
if (maksimum < licznik)
{
maksimum = licznik;
poz_w1 = i + j - k - maksimum + 1;
poz_w2 = j - maksimum + 1;
}
}
else licznik = 0;
}
}
}
System.out.println("Poz w tekst1: " + poz_w1 + ", poz w tekst2: " + poz_w2 + ", dlugosc: " + maksimum);
System.out.println(tekst1.substring(0, pozycja_w1) + "\u001B[31m"
+ tekst1.substring(poz_w1, maksimum + poz_w1) + "\u001B[0m" + tekst1.substring(maksimum + poz_w1) );
System.out.println(tekst2.substring(0, poz_w2) + "\u001B[31m"
+ tekst2.substring(poz_w2, maksimum + poz_w2) + "\u001B[0m" + tekst2.substring(maksimum + poz_w2) );
}
}
Oraz to :
import java.util.Arrays;
public class Main {
public static String[] substring(String s1, String s2){
int[][] tab = new int[Math.max(s1.length(),s2.length())+1][Math.max(s1.length(),s2.length())+1];
for(int i = 0; i <= s1.length(); i++){
for(int j = 0; j <= s2.length(); j++){
tab[i][j] = 0;
}
}
String[] lista = new String[Math.max(s1.length(),s2.length())+1];
for(int i = 0; i <= s1.length(); i++){
for(int j = 0; j <= s2.length(); j++){
if (i == 0 || j == 0){
tab[i][j] = 0;
} else {
if(s1.charAt(i-1) == s2.charAt(j-1)){
tab[i][j] = tab[i-1][j-1]+1;
}
int x = 0;
while (tab[i-x][j-x] > 0){
lista[x] = s1.substring(i-tab[i][j]+x, i);
x++;
}
}
}
}
return lista;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(substring("ABAABBAAABBBA","AAABAABBABABA")));
} // main
}
Jeden wypisuje tylko najdłuższy, a drugi wypisuje tylko kilka wspólnych.
Wiemy, że nie tędy droga, żeby ktoś to za nas napisał. Natomiast chociaż jakaś podpowiedź, co można zrobić od czego zacząć :p