Realisieren Sie eine Klasse GleicheBuchstaben mit einer statischen Methode public static
String gibLaengstesKonstantesStueck(String), die das längste Teilwort der übergebenen
Zeichenkette liefert, in dem alle Zeichen gleich sind. Gibt es mehrere solche Teilwörter, die gleich
lang sind, soll die Methode das erste davon liefern.
Fang immer damit an dir zu überlegen, wie Du vorgehen würdest. Dir wird eine Zeichenkette gegeben und du sollst nun genau diese Thematik manuell heraus finden.
Wie gehst du vor?
publicstaticStringgibLaengstesKonstantesStueck(String s){// hier kommt jetzt dein Code rein}
Bevor du jetzt anfängst deinen Code zu schreiben, mach das was @JustNobody dir geraten hat: Überlege dir erst mal, ohne irgendwelchen Code, wie du das manuell, z.B. auf einem Stück Papier machen würdest.
publicstaticStringgibLaengstesKonstantesStueck(String s){// hier kommt jetzt dein Code rein}
Bevor du jetzt anfängst deinen Code zu schreiben, mach das was @JustNobody dir geraten hat: Überlege dir erst mal, ohne irgendwelchen Code, wie du das manuell, z.B. auf einem Stück Papier machen würdest.
Fang immer damit an dir zu überlegen, wie Du vorgehen würdest. Dir wird eine Zeichenkette gegeben und du sollst nun genau diese Thematik manuell heraus finden.
Wie gehst du vor?
Danke für deine Antwort. ich hab mir die Zeichenkette "Ananas" genommen. Ich weiss jetzt nicht ob das längste Teilwort der übergebenen Zeichenkette sich selbst ist.
Danke für deine Antwort. ich hab mir die Zeichenkette "Ananas" genommen. Ich weiss jetzt nicht ob das längste Teilwort der übergebenen Zeichenkette sich selbst ist.
Fang immer damit an dir zu überlegen, wie Du vorgehen würdest. Dir wird eine Zeichenkette gegeben und du sollst nun genau diese Thematik manuell heraus finden.
Wie gehst du vor?
Realisieren Sie eine Klasse GleicheBuchstaben mit einer statischen Methode public static
String gibLaengstesKonstantesStueck(String), die das längste Teilwort der übergebenen
Zeichenkette liefert, in dem alle Zeichen gleich sind. Gibt es mehrere solche Teilwörter, die gleich
lang sind, soll die Methode das erste davon liefern.
Bei der Definition ist "aaa" nicht das Ergebnis bei "aabcdddeffaaacee". Das erste Teilwort der Länge 3 ist "ddd".
Und Du solltest versuchen möglichst exakt zu sein bei der Beschreibung, was Du machst.
Ich gebe mal einen Anfang vor:
- Ich nehme das erste Zeichen und merke es mir mit Zähler = 1. Teilstring = Zeichen. Rest ist Zeichenkette ohne erstes Zeichen.
- Solange das nächste Zeichen gleich dem gemerkten Zeichen ist, gehe ich ein Zeichen weiter und erhöhe den Zähler um 1, hänge da Zeichen an den Teilstring und entferne das erste Zeichen vom Rest.
- Ist das nächste Zeichen nicht gleich dem gemerkten Zeichen habe ich einen Teilstring mit der Länge vom Zähler gefunden.
Ausführung sähe also dann auf einem Zettel so aus:
-> "aabcdddeffaaacee" ist der Anfang. Das erste Zeichen nehme ich und merke es mir: gemerkt = 'a'; Zähler = 1; Teilstring = "a", Rest: "abcdddeffaaacee"
-> nächstes zeichen ist 'a' also: gemerkt='a'; Zähler = 2; Teilstring= "aa"; Rest="bcdddeffaaacee"
-> nächstes Zeichen ist 'b', also: Teilstring "aa" mit Länge 2 gefunden!
Wie geht es weiter? Was muss man denn weiter machen?
Bei der Definition ist "aaa" nicht das Ergebnis bei "aabcdddeffaaacee". Das erste Teilwort der Länge 3 ist "ddd".
Und Du solltest versuchen möglichst exakt zu sein bei der Beschreibung, was Du machst.
Ich gebe mal einen Anfang vor:
- Ich nehme das erste Zeichen und merke es mir mit Zähler = 1. Teilstring = Zeichen. Rest ist Zeichenkette ohne erstes Zeichen.
- Solange das nächste Zeichen gleich dem gemerkten Zeichen ist, gehe ich ein Zeichen weiter und erhöhe den Zähler um 1, hänge da Zeichen an den Teilstring und entferne das erste Zeichen vom Rest.
- Ist das nächste Zeichen nicht gleich dem gemerkten Zeichen habe ich einen Teilstring mit der Länge vom Zähler gefunden.
Ausführung sähe also dann auf einem Zettel so aus:
-> "aabcdddeffaaacee" ist der Anfang. Das erste Zeichen nehme ich und merke es mir: gemerkt = 'a'; Zähler = 1; Teilstring = "a", Rest: "abcdddeffaaacee"
-> nächstes zeichen ist 'a' also: gemerkt='a'; Zähler = 2; Teilstring= "aa"; Rest="bcdddeffaaacee"
-> nächstes Zeichen ist 'b', also: Teilstring "aa" mit Länge 2 gefunden!
Wie geht es weiter? Was muss man denn weiter machen?
Wie willst Du den das gemerkte Zeichen mit der größten Länge zurückgeben? Was genau musst Du machen? Was musst Du dir denn dann merken und immer machen?
While schleife ist eine Implementierung. Derzeit implementieren wir nichts. Wir wollen erst einmal eine umgangssprachliche Lösung....
Dazu kann ich Dir nur empfehlen sehr genau das Beispiel auf einem Zettel durchzuspielen....
Du willst die Schritte, die ich für die ersten "a" gemacht habe, erneut durchführen: Dann kommst Du auf "b" als Teilstring und Rest "cdddeffaaacee"
Was ist denn da dann evtl. wichtig? Machst Du da irgendwas? Hast Du Dir irgendwas aufgeschrieben / gemerkt?
(Wichtige Regel: DU merkst Dir gar nichts. Wenn Du etwas gemerkt haben willst, dann musst du dafür auf dem Zettel einen Platz markieren und da etwas aufschreiben. Das kannst Du dann auch später durchstreichen und was anderes dafür hinschreiben. Aber Du selbst spielst ganz dummes Mäuschen, das nur auf einem Zettel mit einem Stift etwas schmieren kann und nur ganz einfache Dinge auf dem Zettel vergleichen kann ....)
Was dich doch interessiert ist der größte Teilstring.
Also solltest Du den größten Teilstring, den Du bisher gefunden hast, merken. Und immer wenn Du einen neuen Teilstring hast prüfen, ob dieser größer ist ....
Was dich doch interessiert ist der größte Teilstring.
Also solltest Du den größten Teilstring, den Du bisher gefunden hast, merken. Und immer wenn Du einen neuen Teilstring hast prüfen, ob dieser größer ist ....
Rekursion ist eine Möglichkeit. Das muss aber nicht sein. Bei der Umsetzung ist es so, dass eine Rekursion immer in eine iterative Lösung umgewandelt werden kann. So ist hier eine While Schleife denkbar, die so lange läuft, wie in dem Rest-String noch Zeichen enthalten sind.
Oder wenn man die gegebene Zeichenkette nimmt und in ein Array von Zeichen umwandelt, dann wäre eine einfache Schleife über dieses Array denkbar.
Daher: die konkrete Umsetzung ist da noch nicht festgelegt.
Dann lass uns die Überlegungen doch erst einmal umformulieren, so dass du eine Schleife sehen kannst.
Kannst du die Überlegungen so umschreiben, dass du einfach vom ersten Buchstaben bis zum letzten durchgehst und dann die Lösung hast?
Dann lass uns die Überlegungen doch erst einmal umformulieren, so dass du eine Schleife sehen kannst.
Kannst du die Überlegungen so umschreiben, dass du einfach vom ersten Buchstaben bis zum letzten durchgehst und dann die Lösung hast?
Du jetzt nur überlegen, was Du machen würdest, wenn Du die Zeichenkette durchgehst:
- Initialisierung: Du bist beim ersten Zeichen, das erste Zeichen schreibst Du auf deinen Zettel bei "gemerktes Zeichen: ", bei "Zähler: " schreibst Du 1.
Dann gehen wir in die Schleife:
- Du gehst zum nächsten Zeichen.
--> Was machst/prüfst Du? Was machst Du wenn die Prüfung positiv ist? Was machst Du wenn die Prüfung negativ ist?
Du jetzt nur überlegen, was Du machen würdest, wenn Du die Zeichenkette durchgehst:
- Initialisierung: Du bist beim ersten Zeichen, das erste Zeichen schreibst Du auf deinen Zettel bei "gemerktes Zeichen: ", bei "Zähler: " schreibst Du 1.
Dann gehen wir in die Schleife:
- Du gehst zum nächsten Zeichen.
--> Was machst/prüfst Du? Was machst Du wenn die Prüfung positiv ist? Was machst Du wenn die Prüfung negativ ist?
Was machst Du wenn die Prüfung positiv ist? : Zähler = Zähler+1;
Was machst Du wenn die Prüfung negativ ist? : gehe ich weiter mit dem nächsten Zeichen.
Das ist zu ungenau.
Du bist also über die ersten zwei a drüber und weisst, dass du nun das b hast.
a) Musst Du irgendwas machen/prüfen bezüglich der "aa" / 2 a, was auch immer.
b) wie geht es mit dem b weiter? Du hast ja auf Deiner Seite stehen: gemerktes Zeichen: a, Zähler: 2 - bleibt das alles?
Und das mit dem nächsten Zeichen weiter machen muss ja am Ende so oder so kommen. Das gehört in der Regel mit zu einer Schleife.
Nun versuch es zu verallgemeinern: Wann musst dir was merken?
- Du hast erst "aa", dann kommt "b", "c", "ddd", .... Wann merkst Du Dir was? Musst Du Dir alles merken? Oder nur bei bestimmten Kriterien?
- und du gehst einfach weiter, wenn das Zeichen ein anderes ist? Der Zähler und das gemerkte Zeichen bleiben so wie sie sind?
Also wenn einen nur der längste (bzw. bei gleich langen Elementen das erste Vorkommen) interessiert, dann musst Du alle speichern?
Und bei der Stelle mit dem aktuellen Zeichen und dem Zähler: Was machen wir da? Wir ermitteln doch lediglich den aktuellen Teilstring...
Also wenn einen nur der längste (bzw. bei gleich langen Elementen das erste Vorkommen) interessiert, dann musst Du alle speichern?
Und bei der Stelle mit dem aktuellen Zeichen und dem Zähler: Was machen wir da? Wir ermitteln doch lediglich den aktuellen Teilstring...
Ja, die Lösung ist recht schön, aber probier einmal eine Eingabe "abcdef" -> da müsste "a" rauskommen. Das dürfte bei Dir derzeit aber nicht Fall sein.
Was bei Dir und @Tobias-nrw auffällt: Ihr findet Substrings mehrfach. Daher wäre meine Lösung etwas wie:
Man geht alle Zeichen der Reihe nach durch, ist es nicht das gemerkte Zeichen, dann wird
a) geprüft, ob der Zähler größer ist als das bisher gemerkte Ergebnis um ggf. das Ergebnis auszutauschen.
b) das gemerkte Zeichen wird gesetzt und der Zähler wird auf 0 gesetzt.
Es wird das aktuelle Zeichen gezählt und zum nächsten Zeichen gegangen.
Das wäre auch der Pseudocode gewesen, auf den ich Dich etwas führen wollte. Es braucht keine innere Schleife oder so. Wenn man es auf dem Papier durchspielt, dann macht man das doch auch nicht.
Wenn ich "aaaa" vorgebe, dann zählst Du ja nicht die a vm ersten an: 4, ok, merke mit "aaaa".
Und dann zählst Du vom 2. a an: 3. - 3 ist aber kleiner als 4 ...
Daher generell mein Vorschlag, so Dinge vernünftig auf einem Zettel durchzuspielen. Dann kommt man in der Regel zu einfachen Lösungen.
Eine Micro-Optimierung wäre es nur, wenn man erst eine andere Lösung schreiben würde um diese dann zu optimieren.
Hier geht es um eine geradelinige Umsetzung, also schlichtes überlegen, wie ist vorzugehen und was bedeutet dies.
Einfacher lesbar ist eine Frage der Sichtweise - also zwei Schleifen vs. eine Schleife - da würde zumindest ich die erste Schleife bevorzugen. Besonders nach dem Aufwand, das ja eigentlich als Pseudocode so vorzubereiten (Da wurden halt die Teilstrings nur einmal genommen und nicht mehrfach unterteilt).
Und ja - da habe ich tatsächlich einen kleinen Fehler: der letzte Substring wird nicht verarbeitet.
Das kann man entweder nach der for Schleife berücksichtigen:
Java:
if(currentCharCount > result.length()){
result = source.substring(source.length()- currentCharCount);}
Oder man macht das direkt nach dem hochzählen und schreibt dann das result halt n-fach bei einem Ergebnis der Länge n:
Letzteres ist halt einfach nur eine Schleife um einmal durch den String zu gehen und man hat einfach nur ein aktuellen Bearbeitungspunkt im String, ein gemerktes Zeichen und eine gemerkte Anzahl.