Vérifier si une chaîne contient toutes les lettres de l'alphabet avec Java

1. Vue d'ensemble

Dans ce tutoriel, nous verrons comment vérifier si une chaîne contient toutes les lettres de l'alphabet ou non.

Voici un exemple rapide: «Le fermier Jack s'est rendu compte que les grandes couettes jaunes étaient chères. ”- 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. Puis utilisera des expressions régulières. Et enfin, nous profiterons d'une approche plus déclarative utilisant Java 8.

De plus, 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 d'entrée caractère par caractère et marquer le caractère comme visité.

Veuillez noter que les majuscules et les minuscules sont considérées comme identiques. Ainsi, l'indice 0 représente à la fois A et a, de même, 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 l' ensemble est vide. Pour les besoins de l'exercice cependant, cet algorithme est assez bon.

3. Utilisation d'une 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 de l' entrée . Ensuite, nous supprimons les caractères en double. Enfin, nous comptons les lettres et nous nous assurons de les avoir toutes, 26.

Bien que moins performant, Big-O-Complexity de cette approche tend également vers 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 le filtre de Stream et des méthodes distinctes :

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

Big-O-complexité de cette approche sera également O (n).

4. Test

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, la phrase contient toutes les lettres de l'alphabet, par conséquent, nous attendons vrai en conséquence.

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 quelques façons de mettre en œuvre cette première en utilisant la programmation impérative traditionnelle, les expressions régulières et les flux Java 8.

Le code source complet est disponible à l'adresse over sur GitHub.