Prüfen Sie, ob eine Zeichenfolge alle Buchstaben des Alphabets enthält

Überprüfen Sie, ob eine Zeichenfolge alle Buchstaben des Alphabets enthält

1. Überblick

In diesem Tutorial erfahren Sie, wie Sie überprüfen, ob ein String alle Buchstaben des Alphabets enthält oder nicht.

Hier ein kurzes Beispiel: "Farmer jack realized that big yellow quilts were expensive." - enthält tatsächlich alle Buchstaben des Alphabets.

Wir werden drei Ansätze diskutieren.

Zunächst modellieren wir den Algorithmus mithilfe eines imperativen Ansatzes. Dann werden reguläre Ausdrücke verwendet. Und schließlich werden wir einen deklarativeren Ansatz mit Java 8 nutzen.

Darüber hinaus werden wir die Big-O-Komplexität der gewählten Ansätze diskutieren.

2. Imperativer Algorithmus

Implementieren wir einen imperativen Algorithmus. Dazu erstellen wir zunächst ein besuchtes boolesches Array. Anschließend gehen wir Zeichen für Zeichen durch die Eingabezeichenfolge und markieren das Zeichen als besucht.

Bitte beachten Sie, dassUppercase undLowercase gleich sind. Der Index 0 repräsentiert also sowohl A als auch a, ebenso repräsentiert der Index 25 sowohl Z als auch z.

Schließlich prüfen wir, ob alle Zeichen im besuchten Array auf true gesetzt sind:

public class EnglishAlphabetLetters {

    public static boolean checkStringForAllTheLetters(String input) {
        int index = 0;
        boolean[] visited = new boolean[26];

        for (int id = 0; id < input.length(); id++) {
            if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') {
                index = input.charAt(id) - 'a';
            } else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') {
                index = input.charAt(id) - 'A';
            }
            visited[index] = true;
        }

        for (int id = 0; id < 26; id++) {
            if (!visited[id]) {
                return false;
            }
        }
        return true;
    }
}

Die Big-O-Komplexität dieses Programms ist O (n), wobein die Länge des Strings ist.

Beachten Sie, dass es viele Möglichkeiten gibt, den Algorithmus zu optimieren, z. B. Buchstaben aus einer Menge zu entfernen und zu brechen, sobaldSet leer ist. Für die Zwecke der Übung ist dieser Algorithmus jedoch gut genug.

3. Regulären Ausdruck verwenden

Mit dem regulären Ausdruck können wir mit ein paar Codezeilen problemlos dieselben Ergebnisse erzielen:

public static boolean checkStringForAllLetterUsingRegex(String input) {
    return input.toLowerCase()
      .replaceAll("[^a-z]", "")
      .replaceAll("(.)(?=.*\\1)", "")
      .length() == 26;
}

Hier entfernen wir zuerst alle Zeichen außer den Buchstaben aus deninput. Dann entfernen wir doppelte Zeichen. Schließlich zählen wir Briefe und stellen sicher, dass wir alle haben, 26.

Obwohl weniger performant, tendiert die Big-O-Komplexität dieses Ansatzes auch zu O (n).

4. Java 8 Stream

Mit Java 8-Funktionen können wir mit den Methodenfilter anddistinctvon Stream auf kompakte und deklarative Weise problemlos dasselbe Ergebnis erzielen:

public static boolean checkStringForAllLetterUsingStream(String input) {
    long c = input.toLowerCase().chars()
      .filter(ch -> ch >= 'a' && ch <= 'z')
      .distinct()
      .count();
    return c == 26;
}

Die Big-O-Komplexität dieses Ansatzes wird auch O (n) sein.

4. Testen

Testen wir einen glücklichen Weg für unseren Algorithmus:

@Test
public void givenString_whenContainsAllCharacter_thenTrue() {
    String sentence = "Farmer jack realized that big yellow quilts were expensive";
    assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence));
}

Hier enthältsentence alle Buchstaben des Alphabets, daher erwarten wir als Ergebnistrue.

5. Fazit

In diesem Tutorial erfahren Sie, wie Sie überprüfen, ob eine Zeichenfolge alle Buchstaben des Alphabets enthält .

Wir haben verschiedene Möglichkeiten gesehen, dies zuerst mit traditioneller imperativer Programmierung, regulären Ausdrücken und Java 8-Streams zu implementieren.

Der vollständige Quellcode ist inover on GitHub verfügbar.