Sich wiederholende substrings finden

xxMarlonXX

Mitglied
Hallo zusammen,
Ich arbeite gerade an einem Programm, das verschlüsselte Texte ohne viel Informationen wieder entschlüsseln, also quasi knacken kann. Es ist auch schon fertig, hat nur noch 1, 2 Schönheitsfehler. Undzwar ist das einzige was das Programm braucht, Informationen darüber, ob in dem verschlüsselten Text bestimmte Zeichenfolgen (ab einer Länge von 3 Zeichen) wiederholt auftreten. Solche Zeichenfolgen müssen ausfindig gemacht werden. Meistens reicht es aus, wenn man 2-3 solcher substrings mit jeweils 3-4 Zeichen findet. Bis jetzt habe ich das von Hand gemacht, also die Texte schriftlich analysiert. Es wäre jedoch schöner wenn das Programm selbst die substrings findet, aber ich weiß nicht so recht wie ich das anstellen soll. Mit bei contains, indexof etc. muss die gesuchte Zeichenkette ja vorher bekannt sein, ist sie aber nicht. Jetzt ist die Frage, wie ich meinen verschlüsselten Text zerlegen und prüfen muss um die Wiederholungen zu finden. Hoffe das Problem ist verständlich und dass ihr mir weiterhelfen könnt :)
LG

P. S. Wem es weiterhilft: Es geht um Texte, die mit Vigenere verschlüsselt wurden.
 

Joose

Top Contributor
Bis jetzt habe ich das von Hand gemacht, also die Texte schriftlich analysiert. Es wäre jedoch schöner wenn das Programm selbst die substrings findet, aber ich weiß nicht so recht wie ich das anstellen soll. Mit bei contains, indexof etc. muss die gesuchte Zeichenkette ja vorher bekannt sein, ist sie aber nicht. Jetzt ist die Frage, wie ich meinen verschlüsselten Text zerlegen und prüfen muss um die Wiederholungen zu finden.
Wie gehst du denn vor wenn du es per Hand machst? Schaust du nur ob dir optisch Wiederholungen ins Auge stechen oder gehst du da jedes Zeichen einzeln durch usw.?
Genau dieses vorgehen mit Hand versuche in Code umzusetzen. Es ist vielleicht nicht gleich die optimalste Lösung, aber du solltest zu einem Ziel kommen.
Danach kann man den Code immer noch optimieren.
 

xxMarlonXX

Mitglied
Danke für eure Antworten erstmal.
Wie gehst du denn vor wenn du es per Hand machst? Schaust du nur ob dir optisch Wiederholungen ins Auge stechen oder gehst du da jedes Zeichen einzeln durch usw.?
Ja ich habe quasi geschaut wo es relativ offensichtliche Wiederholungen gibt, bin also nicht jedes Zeichen einzeln durchgegangen, das wäre bei etwas längeren Texten ja viel zu umständlich. Hab es wie folgt programmiert und es klappt auch alles, aber vielleicht habt ihr ja noch Verbesserungsvorschläge:

Java:
public static ArrayList<String> findRepeatingSubstrings(String s){
      
        String[][] groups = new String[3][s.length()];
        char[] text = s.toCharArray();
        ArrayList<String> substrings = new ArrayList<String>();
      
        //1. TEXT IN ALLE MOEGLICHEN FÜNFER GRUPPEN SPLITTEN -> groups[0]  
        int count = 0;
        for(int i = 0; i < s.length(); i++){
            if(i+4 > s.length()-1){
                break;
            }
            groups[0][count++] = (text[i]  + "") + (text[i+1]  + "") + (text[i+2]  + "") + (text[i+3]  + "") + (text[i+4]  + "");
        }
      
        //2. TEXT IN ALLE MOEGLICHEN VIERER GRUPPEN SPLITTEN -> groups[1]      
        count = 0;
        for(int i = 0; i < s.length(); i++){
            if(i+3 > s.length()-1){
                break;
            }
            groups[1][count++] = (text[i]  + "") + (text[i+1]  + "") + (text[i+2]  + "") + (text[i+3]  + "");
        }
      
        //3. TEXT IN ALLE MOEGLICHEN DREIER GRUPPEN (TRIPLETS) SPLITTEN    -> groups[2]  
            count = 0;
            for(int i = 0; i < s.length(); i++){
                if(i+2 > s.length()-1){
                    break;
                }
                groups[2][count++] = (text[i]  + "") + (text[i+1]  + "") + (text[i+2] + "");
      
            }      

      
        //Die einzelnen Gruppen nach Wiederholungen durchsuchen
        for(int i = 0; i < 3; i++){
            for(int k = 0; k < groups[i].length; k++){
                if(groups[i][k] ==  null){
                    break;
                }
                String [] strings = s.split(groups[i][k]);
                if(strings.length >= 4){
                    if(!Arrays.asList(substrings).contains(groups[i][k]))
                    substrings.add(groups[i][k]);
                }
            }
        }
          
        return substrings;
    }

LG
 

Joose

Top Contributor
Deine for-Schleifen sehen sich ziemlich ähnlich. Hier könnte man die for-Schleife in eine Methode auslagern. Der Vorteil der sich daraus ergibt -> man muss bei einer Änderung nur noch eine Schleife statt 3 warten ;)

Wenn du mit der Methode "substring" arbeitest ersparst du dir das zusammenhängen der einzelnen Zeichen.

Ansonsten könntest du noch das 2dimensionale String Array durch verschachtelte Listen ersetzen. Dadurch wirst du dynamischer wenn du nicht mehr nur 5er, 4er und 3er Gruppen finden willst sondern auch andere Größen.

Ich habe den Code mal "etwas" überarbeitet ;) ist aber ungetestet könnte sich also vielleicht auch ein Fehler eingeschlichen haben.

Java:
public static ArrayList<String> findRepeatingAllSubstrings(String text) {
   ArrayList<ArrayList<String>> allGroups = new ArrayList<ArrayList<String>>();
   int maxGroupSize = 5;
   int minGroupSize = 3;

   for(; minGroupSize <= maxGroupSize; minGroupSize++) {
     ArrayList<String> group = new ArrayList<String>();   
     splitTextInGroups(text, group, minGroupSize);
     allGroups.add(group);
   }

   ArrayList<String> allSubstrings = new ArrayList<String>();
   //Die einzelnen Gruppen nach Wiederholungen durchsuchen
   for(ArrayList<String> group : allGroups) {
     for(String substring : group) {
       if(substring == null) {
         break;
       }
       String[] parts = s.split(substring);
       if(parts.length >= 4 && !allSubstrings.contains(substring)) {
         allSubstrings.add(substring);
       }
     }
   }
   return allSubstrings;
}

private static void splitTextInGroups(String text, ArrayList<String> group, int groupSize) {
   if(groupSize < 1) {
     throw new IllegalArgumentException("Die groupSize muss größer als 0 sein!");
   }
   for(int i = 0; i < s.length(); i++) {
     if(i + groupSize > s.length()) {
       break;
     }
     group.add(text.substring(i, i + groupSize);
   }
}

Mir ist noch aufgefallen dass man die eine oder andere Überprüfung noch einbauen kann/sollte.
 
Zuletzt bearbeitet:

xxMarlonXX

Mitglied
Ich habe die Anpassungen gemacht Danke dafür. Nach ein paar weiteren Modifikationen ist mein Code auch um ein vielfaches schneller geworden! :D
Ich bin mit dem Gesamtprojekt schon ein ganzes Stück weiter, mein Programm schafft es alle Texte, die mit einem bis zu vierstelligen Schlüsselwort verschlüsselt wurden zu knacken (Info über die Verschlüsselung: 1. https://de.wikipedia.org/wiki/Vigenère-Chiffre , 2. https://de.wikipedia.org/wiki/Kasiski-Test) . Warum es ab fünf Stellen gelegentlich Fehler gibt liegt (denke ich) immer noch an meiner Implementierung zur Auswahl der richtigen SubStrings (kann ja immer sein, dass manche Wiederholungen Zufall sind) und später dann in gelegentlichen Unregelmäßigkeiten bei der Häufigkeitsanalyse. Ich will nicht nerven aber gibt es irgendwo eine Möglichkeit über ganze Projekte zu diskutieren? Du oder andere User könnten mir bestimmt noch den eben genannten Problemen helfen...
LG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
P Regulärer Ausdruck um sich wiederholende Zeichen zu finden. Allgemeine Java-Themen 9
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
A Eclipse hängt sich auf Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
Viper13125 Eclipse Hängt sich auf, wenn ich SimpelDateFormat drin lasse Allgemeine Java-Themen 2
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
D Anfänger versucht sich an Xtext Allgemeine Java-Themen 0
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
P JavaFX Anwendung beendet sich selbst nur als Jar Allgemeine Java-Themen 40
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
J Bilder lassen sich nicht importieren Allgemeine Java-Themen 3
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
P Input/Output Inputstream verhält sich verschieden Allgemeine Java-Themen 9
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
K Java installiert sich nicht ganz Allgemeine Java-Themen 15
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
L Jar lässt sich nicht öffnen Allgemeine Java-Themen 12
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
F Wert ändert sich nicht Allgemeine Java-Themen 12
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
M Programm startet sich selbst neu, alte Logfiles bleiben gesperrt Allgemeine Java-Themen 2
J String Variable verändert sich plötzlich Allgemeine Java-Themen 8
K Java lässt sich nicht Installieren Windows7Ultimate 64Bit Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
I JPanel soll sich dem JFrame anpassen Allgemeine Java-Themen 1
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
L Prog läuft in der IDE, hängt sich aber am Mac auf Allgemeine Java-Themen 0
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
G Services verwenden sich gegenseitig Allgemeine Java-Themen 4
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
J kann eine .jar sich selbst verschieben? Allgemeine Java-Themen 6
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Selbsterstellte 404-Seiten bestimmen, die sich als 200 ausgeben Allgemeine Java-Themen 8
D Arrays überschreiben sich Allgemeine Java-Themen 2
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
D Dialog soll sich beim Klick auf Button schließen Allgemeine Java-Themen 8
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
P jar-Datei lässt sich nicht ausführen Allgemeine Java-Themen 5
E nach dem Ordner suchen, wo .jar datei sich befindet Allgemeine Java-Themen 17
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
D JMF - lässt sich nicht im ausgewählten Format aufnehmen Allgemeine Java-Themen 2
ruutaiokwu enlosschleife in thread beendet sich Allgemeine Java-Themen 3
F Javainstallation verweigert sich mir Allgemeine Java-Themen 11
M Java lässt sich nicht installieren Allgemeine Java-Themen 10
T Programm hängt sich auf Allgemeine Java-Themen 14
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
V JRE lässt sich nicht installieren. Allgemeine Java-Themen 10
W 2D-Grafik nach getthumbnail läst sich Quellbild nicht mehr löschen Allgemeine Java-Themen 3
J Eclipse Eclipse hängt sich ständig auf Allgemeine Java-Themen 6
L JDK lässt sich nicht deinstallieren Allgemeine Java-Themen 3
T KeyListener lässt sich nur einmal drücken Allgemeine Java-Themen 2
J Können Programme sich selbst erweitern? Allgemeine Java-Themen 6
T Datenbank lässt sich un Entwicklungsumgebung öffnen, aus .jar aber nicht Allgemeine Java-Themen 9
L Java Thread [blockingqueue] hängt sich auf Allgemeine Java-Themen 13
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
S Element aus ArrayListe löschen --> Thread hängt sich auf Allgemeine Java-Themen 2
T Thread beendet sich "einfach so"? Allgemeine Java-Themen 13
M Radianwert wiederholt sich trotz unterschiedlicher zufälliger Koordinaten Allgemeine Java-Themen 6
B Benachrichtigung, wenn sich Benutzer am Betriebssystem anmeldet Allgemeine Java-Themen 9
X Über ArrayList iterieren, während sich diese verändert Allgemeine Java-Themen 3
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben