Zeichen in String vergleichen

Flown

Administrator
Mitarbeiter
Also ich würde auch am Anfang überprüfen, ob die Länge auch stimmt.
Java:
public static boolean wort(String s) {
  int n = (int) (Math.sqrt(8 * s.length() + 1) - 1) / 2;
  if ((n * n + n) / 2 != s.length()) {
    return false;
  }
  
  for (int i = 0, step = 1; i < s.length(); i += step, step++) {
    char c = s.charAt(i);
    for (int j = 1; j < step; j++) {
      if (c != s.charAt(i + j)) {
        return false;
      }
    }
  }
  return true;
}
 

Meniskusschaden

Top Contributor
@regtan: Damit das zwischen den verschiedenen Lösungsvorschlägen nicht ganz untergeht: Auch wenn es eleganter geht, ist deine Lösung aus Post #12 im Grunde genommen bereits fertig und ich würde dir dringend empfehlen, die verbliebenen Fehler noch selbst zu beseitigen, auch wenn du jetzt eine andere Lösung hast.
Mir ist in diesem Thread und auch in einigen deiner anderen Threads aufgefallen, dass du meistens nur feststellen kannst, ob das Programm funktioniert oder nicht und dass du Lösungsvorschläge ziemlich unreflektiert einbaust. Du hast offenbar keine richtige Vorstellung, was im einzelnen überhaupt abläuft und wo die Fehlerursache liegen könnte. Wenn ein Programm dann mehrere Fehler enthält (was normal ist), erkennst du es deshalb nicht, wenn du einen Fehler beseitigt hast und dem Ziel einen Schritt näher gekommen bist. In dieser Hinsicht sieht man bei dir kaum Fortschritte. Ich würde deshalb versuchen, Strategien zur Fehlersuche zu entwickeln, etwa durch Schreibtischtests, Ausgabe relevanter Variablen an sinnvollen Stellen und Gebrauch des Debuggers.
 
X

Xyz1

Gast
Jetzt mal weg vom Verständnis, was vielleicht noch fehlt: Das riecht schon wieder nach einem (richtigen) Benchmark-Test. : D
 

BuddaKaeks

Bekanntes Mitglied
Zudem fehlt bei euch noch der Test, ob in aufeinanderfolgenden Parts aucg verschiedene chars sind
Nach Aufgabenstellung wäre ja abbccc korrekt aber zB aaaccc falsch, der Algorithmus würde aber true rauskriegen.
Weil Aufgabenstellung war ja:
Schnapszahl <==> der n-te Buchstabe taucht n Mal hintereinander auf.

Is jetzt noch auslegungssache, ob abbaaa erlaub ist, oder ob baab erlaubt ist, immerhin ist b der (im String) erste Buchstabe und kommt auch beim zweiten Vorkommen nur einmal in Folge vor :D
 

X5-599

Top Contributor
Also ich würde mal behaupten, dass "abbaaa" gültig ist.

Andere Frage: Gehe ich recht in der Annahme, dass die meisten anderen Lösungen, die hier gepostet wurden so funktionieren, dass so oft Buchstaben miteinander verglichen werden wie man erwartet? Also zuerst: 1 innerer Schleifendurchgang (um B und B zu vergleichen), dann 2 innere Schleifendurchgänge (um C und C dann C und C zu vergleichen) usw?
Wenn dem so ist, würde allerdings auch ein String "ABBCCCDDDD DDDDD" als "true" angesehen. Der SPACE dient hier nur der Übersichtlichkeit. Es wird ermittelt, dass B zweimal vorkommt, dass C dreimal vorkommt, dass D viermal vorkommt und dann zum Schluss, dass D fünfmal vorkommt. Wenn ich nur die per Iterationsdurchgang erwarteten Anzahl an gleichen Buschstaben vergleiche, gäbe es hier ein positives Ergebnis. (Jeweils zwei, drei, vier und fünf gleiche Buchstaben hintereinander)
Wie gesagt finde ich, dass Buchstaben schon öfters im String vorkommen dürfen. Aber wenn sie direkt hintereinander auftreten ist das meiner Meinung nach falsch. Es sollten dann festgestellt werden: B kommt zweimal vor, C kommt dreimal vor und D kommt neunmal vor. Ergebnis: Kein Schnappsstring.

Ist natürlich nur meine Auffassung. Was meint ihr?
 

BuddaKaeks

Bekanntes Mitglied
Ja genau das meinte ich ja in meinem Post.
a aabbb wäre true, abb bbb wäre auch true usw.
Aber nach Aufgabenstellung ist das definitv kein Schnapsstring.
Irgend ne Lösung dafür zu finden ist sicher nicht schwer, aber vllt gibt es ja eine ganz elegante Lösung, die irgendwie alles mehr oder weniger gleichzeitig in einer Schleife ohne viel if und else bewerkstelligt?
 

Flown

Administrator
Mitarbeiter
Ein anderer Lösungsansatz wäre erst die Flanken zu erkennen: D.h. sehen an welchen Stellen im Array: s.charAt(i-1) != s.charAt(i) liegt.
Danach kann man einfach die Schrittweite jeder Flanke zur Vorhergehenden berechenen und prüfen.
Java:
public static boolean wort(String s) {
  if (s == null || s.isEmpty()) {
    return false;
  }
  int[] edges = new int[s.length() + 1];
  int length = 0;
  for (int i = 0; i <= s.length(); i++) {
    if (i == 0 || i == s.length() || s.charAt(i) != s.charAt(i - 1)) {
      edges[length++] = i;
    }
  }

  for (int i = 1, step = 1; i < length; i++, step++) { // i == step -> also kann das Eine oder Andere weggelassen werden, aber zwecks Übersichtlichkeit
    int diff = edges[i] - edges[i - 1];
    if (diff != step) {
      return false;
    }
  }
  return true;
}
 
Zuletzt bearbeitet:

BuddaKaeks

Bekanntes Mitglied
Also ich hab noch diese Lösung im Repetoire, sollte eigentlich alle Anforderungen erfüllen:
Java:
boolean wort(String text){
        char[] chars = text.toCharArray();
        int i = 0, j = 0;
        for(int k = 1; i < chars.length-1; i++){
            if((chars[i] == chars[i+1])^(i == j ? (j+=++k) < 0 : true)){
                return false;
            }
        }
        return i == j;
    }
 
X

Xyz1

Gast
Bitteschön, kann von der Performance glaube ich nicht eingeholt werden:
Java:
    public static void main(String[] args) {
        String text = "abbcccddddeeeeeffffff";
        String text2 = text.toUpperCase();
        System.out.println(schnaps(text));
        System.out.println(schnaps(text2));
    }

    static boolean schnaps(String text) {
        try {
            for (int i = 0, j = 1; i < text.length(); i += j, j++) {
                System.out.println(text.substring(i, i + j)); // just an output ....
                char befor = i > 0 ? text.charAt(i - 1) : (char) (text.charAt(i) - 1);
                char after = text.charAt(i);
                if (befor + 1 != after) {
                    return false;
                }
                for (int k = i; k < i + j; k++) {
                    if (text.charAt(k) != after) {
                        return false;
                    }
                }
            }
        } catch (StringIndexOutOfBoundsException sioobe) {
            return false;
        }
        return true;
    }

Auch ich 3 Variablen inzwischen...
 
X

Xyz1

Gast
An der Stelle ist die Aufgabenstellung/Definitionem ungenau. ;)

(Edit: Der Editor und das Thema hakt ganz schön, mittlerweile^^)
 
X

Xyz1

Gast
Okay, dann Substituiere + 1:
Java:
    public static void main(String[] args) {
        String text = "abbcbcddddeeeeeffffff";
        String text2 = text.toUpperCase();
        System.out.println(schnaps(text));
        System.out.println(schnaps(text2));
    }

    static boolean schnaps(String text) {
        try {
            for (int i = 0, j = 1; i < text.length(); i += j, j++) {
                System.out.println(text.substring(i, i + j)); // just an output ....
                char befor = i > 0 ? text.charAt(i - 1) : (char) (text.charAt(i) - 1);
                char after = text.charAt(i);
                if (befor == after) {
                    return false;
                }
                for (int k = i; k < i + j; k++) {
                    if (text.charAt(k) != after) {
                        return false;
                    }
                }
            }
        } catch (StringIndexOutOfBoundsException sioobe) {
            return false;
        }
        return true;
    }
 
X

Xyz1

Gast
Zuvor bleiben aber noch Fragen offen,
1) der n-te Buchstabe des Alphabets oder des Strings,
2) sind Teilstrings auch disjunkte Teilmengen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G String vergleichen:Platzhalter für bel. Zeichen Java Basics - Anfänger-Themen 5
G die ersten Zeichen eines Strings Vergleichen mit String Java Basics - Anfänger-Themen 6
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
T Zeichen im String verschiebe Java Basics - Anfänger-Themen 17
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
L String auf bestimmte zeichen untersuchen Java Basics - Anfänger-Themen 9
D gebe string zurück mit von bis bestimmtes Zeichen Java Basics - Anfänger-Themen 4
Y String auf allgemein Zeichen untersuchen Java Basics - Anfänger-Themen 3
S String trennen nach beliebigen Zeichen Java Basics - Anfänger-Themen 3
C Zeichen im String bis zu bestimmter Stelle entfernen Java Basics - Anfänger-Themen 6
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
B zeichen eines String mit der kleinsten Frequenz zurückgeben Java Basics - Anfänger-Themen 25
m0n4ch Variablen String auf ungültige Zeichen überprüfen Java Basics - Anfänger-Themen 13
Voreck String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 9
D String Zeichen für Zeichen auslesen Java Basics - Anfänger-Themen 5
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
I String abschneiden erste und letzte Zeichen Java Basics - Anfänger-Themen 3
S Leerzeichen zwischen zwei Zeichen im String entfernen Java Basics - Anfänger-Themen 19
F In einem String nach einem String suchen und Zeichen danach ausgeben Java Basics - Anfänger-Themen 6
Q Erste Schritte Zeichen in String farblich hervorheben Java Basics - Anfänger-Themen 4
P String Zeichen zuweisen Java Basics - Anfänger-Themen 3
P Methode die String auf Zeichen überprüft Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
J String Ausgabe nicht-leerer Zeichen nicht korrekt Java Basics - Anfänger-Themen 10
I Zeichen aus String ziehen Java Basics - Anfänger-Themen 3
J Zeichen aus String Array lesen Java Basics - Anfänger-Themen 13
T String - kleinstes Zeichen bestimmen Java Basics - Anfänger-Themen 3
B String der eigentlich eine Ansammlung von HEX zeichen ist in datei schreiben in Hex Java Basics - Anfänger-Themen 8
C String auf bestimmtes Zeichen prüfen Java Basics - Anfänger-Themen 7
G String mit verschiedenen Zeichen analysieren Java Basics - Anfänger-Themen 5
S String mit ASCII/HTML Zeichen darstellen Java Basics - Anfänger-Themen 10
J Ascii Zeichen von einem String umwandeln und ausgeben Java Basics - Anfänger-Themen 11
A einzelne Zeichen aus String auslesen Java Basics - Anfänger-Themen 3
J Aus einem String unbekannte zeichen filtern Java Basics - Anfänger-Themen 11
M zeichen aus string entfernen Java Basics - Anfänger-Themen 2
T Erstes Zeichen aus String löschen Java Basics - Anfänger-Themen 8
S Zeichen in einem String hochstellen? Java Basics - Anfänger-Themen 9
M Erstes Zeichen in einem String in Großbuchstaben wandeln Java Basics - Anfänger-Themen 3
D prüfen ob string nur ascii zeichen enthält Java Basics - Anfänger-Themen 7
vandread Kann in einer String-ArrayList keine Zeichen anhängen Java Basics - Anfänger-Themen 5
E Leerstring bzw String mit x Zeichen erzeugen? Java Basics - Anfänger-Themen 13
B OOP String auf bestimmte Zeichen abfragen Java Basics - Anfänger-Themen 4
I String ohne Zeichen zerlegen lassen Java Basics - Anfänger-Themen 5
E Zeichen in String löschen Java Basics - Anfänger-Themen 15
S String Split ohne Zeichen abzuschneiden Java Basics - Anfänger-Themen 7
Povlsen84 String - Zeichen am Anfang entfernen Java Basics - Anfänger-Themen 11
S Zeichen aus String rausfiltern Java Basics - Anfänger-Themen 4
G Enter-Zeichen aus String ersetzen Java Basics - Anfänger-Themen 5
J String nur mit ASCII-Zeichen Java Basics - Anfänger-Themen 4
S String auf unzulässige Zeichen überprüfen Java Basics - Anfänger-Themen 4
D Zeichen im String ändern -> Fehlersuche Java Basics - Anfänger-Themen 7
G String auf Zeichen überprüfen Java Basics - Anfänger-Themen 6
G HTML Zeichen aus String entfernen? Java Basics - Anfänger-Themen 5
M bestimmte Zeichen in String eliminieren Java Basics - Anfänger-Themen 2
G Wieviele Zeichen kann ein String maximal speichern? Java Basics - Anfänger-Themen 3
O String in array einlesen alle x zeichen Java Basics - Anfänger-Themen 15
S Anzahl von Zeichen in einem String suchen und zählen Java Basics - Anfänger-Themen 1
G String ab definiertem Zeichen abschneiden Java Basics - Anfänger-Themen 4
U String um zeichen ergänzen Java Basics - Anfänger-Themen 24
M aus String extrahieren bis zu gewissem Zeichen Java Basics - Anfänger-Themen 7
G String zeichen richtig untreinander Java Basics - Anfänger-Themen 2
G wie mehrere Zeichen in string löschen Java Basics - Anfänger-Themen 3
L String darf nur spezielle Zeichen enthalten Java Basics - Anfänger-Themen 6
H text string alle 100 zeichen in ein 1D array einlesen ? Java Basics - Anfänger-Themen 8
B nach Zeichen suchen dass im string mehrmals vorkommt Java Basics - Anfänger-Themen 3
M String nach einer bestimmten Anzahl von Zeichen trennen Java Basics - Anfänger-Themen 2
M Aus einem String bestimmte zeichen auslesen und ausgeben Java Basics - Anfänger-Themen 8
W String mit Vorgegebenen Zeichen Java Basics - Anfänger-Themen 3
D String kann zeichen nicht lesen Java Basics - Anfänger-Themen 3
D String, erste zeichen löschen Java Basics - Anfänger-Themen 6
D String/StringBuffer mit Zeichen einer Sorte füllen Java Basics - Anfänger-Themen 14
J String - einzelne Zeichen sortieren Java Basics - Anfänger-Themen 14
A ein string zeichen für zeichen lesen Java Basics - Anfänger-Themen 3
G Zeichen an bestimmter Stelle im String einfügen. Java Basics - Anfänger-Themen 4
B String auf bestimmtes Zeichen überprüfen Java Basics - Anfänger-Themen 7
A String um 1 Zeichen kürzen ? Java Basics - Anfänger-Themen 6
M Ein bestimmtes Zeichen in einem String ändern Java Basics - Anfänger-Themen 4
F Zeichen in String ersetzen mit 1.3 Java Basics - Anfänger-Themen 9
T String mit dem Hexwert in normales Zeichen umwandeln? Java Basics - Anfänger-Themen 6
G letztes Zeichen aus einem String Java Basics - Anfänger-Themen 2
G String auf Länge und Zeichen überprüfen Java Basics - Anfänger-Themen 10
R Zeichen von String zählen Java Basics - Anfänger-Themen 5
A String Zeichen löschen in einer bestimmten Reihenfolge Java Basics - Anfänger-Themen 25
N String nach Zeichen ersetzen Java Basics - Anfänger-Themen 6
G String: nach 3. Zeichen char ersetzen Java Basics - Anfänger-Themen 3
O nur bestimmte Zeichen in einem String zählen. Java Basics - Anfänger-Themen 1
Dilandau ascii code von zeichen in string ermitteln? Java Basics - Anfänger-Themen 9
J Quelltext mit komischen griechischen Zeichen Java Basics - Anfänger-Themen 4
T or zeichen Java Basics - Anfänger-Themen 2
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S Was bedeutet das Zeichen := Java Basics - Anfänger-Themen 9

Ähnliche Java Themen


Oben