Vérifier si une chaîne contient toutes les lettres de l'alphabet
1. Vue d'ensemble
Dans ce didacticiel, nous allons voir comment vérifier si une chaîne contient toutes les lettres de l'alphabet ou non.
Voici un exemple rapide: «Farmer jack realized that big yellow quilts were expensive.» - qui contient en fait toutes les lettres de l'alphabet.
Nous discuterons de trois approches.
Tout d'abord, nous modéliserons l'algorithme en utilisant une approche impérative. Ensuite, utilisera des expressions régulières. Et enfin, nous profiterons d'une approche plus déclarative utilisant Java 8.
En outre, nous discuterons de la grande complexité des approches adoptées.
2. Algorithme impératif
Implémentons un algorithme impératif. Pour cela, nous allons d'abord créer un tableau booléen visité. Ensuite, nous allons parcourir la chaîne de saisie caractère par caractère et marquer le caractère comme visité.
Veuillez noter queUppercase etLowercase sont considérés comme identiques. Donc, l'indice 0 représente à la fois A et a, de même que l'indice 25 représente à la fois Z et z.
Enfin, nous vérifierons si tous les caractères du tableau visité sont définis sur true:
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;
}
}
Big-O-complexité de ce programme est O (n) oùn est la longueur de la chaîne.
Notez qu'il existe de nombreuses façons d'optimiser l'algorithme, telles que la suppression de lettres d'un ensemble et la rupture dès que leSet est vide. Pour les besoins de l'exercice, cet algorithme est suffisant.
3. Utiliser l'expression régulière
En utilisant l'expression régulière, nous pouvons facilement obtenir les mêmes résultats avec quelques lignes de code:
public static boolean checkStringForAllLetterUsingRegex(String input) {
return input.toLowerCase()
.replaceAll("[^a-z]", "")
.replaceAll("(.)(?=.*\\1)", "")
.length() == 26;
}
Ici, nous éliminons d'abord tous les caractères sauf les lettres de l'alphabet desinput. Ensuite, nous supprimons les caractères en double. Enfin, nous comptons les lettres et veillons à les avoir toutes, 26.
Bien que moins performant, Big-O-Complexity de cette approche tend également à O (n).
4. Flux Java 8
En utilisant les fonctionnalités de Java 8, nous pouvons facilement obtenir le même résultat de manière plus compacte et déclarative en utilisant les méthodesfilter anddistinctde Stream:
public static boolean checkStringForAllLetterUsingStream(String input) {
long c = input.toLowerCase().chars()
.filter(ch -> ch >= 'a' && ch <= 'z')
.distinct()
.count();
return c == 26;
}
La complexité de cette approche sera aussi O (n).
4. Essai
Testons un chemin heureux pour notre algorithme:
@Test
public void givenString_whenContainsAllCharacter_thenTrue() {
String sentence = "Farmer jack realized that big yellow quilts were expensive";
assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence));
}
Ici,sentence contient toutes les lettres de l'alphabet, par conséquent, nous attendonstrue comme résultat.
5. Conclusion
Dans ce didacticiel, nous avons expliqué comment vérifier si une chaîne contient toutes les lettres de l'alphabet .
Nous avons vu plusieurs manières de mettre en œuvre cette première utilisation en utilisant la programmation impérative traditionnelle, les expressions régulières et les flux Java 8.
Le code source complet est disponibleover on GitHub.