Kontroller, om en streng indeholder alle bogstaverne i alfabetet med Java

1. Oversigt

I denne vejledning ser vi, hvordan vi kontrollerer, om en streng indeholder alle bogstaverne i alfabetet eller ej.

Her er et hurtigt eksempel: “Landmandsknægt indså, at store gule dyner var dyre.”- som faktisk indeholder alle bogstaverne i alfabetet.

Vi diskuterer tre tilgange.

Først modellerer vi algoritmen ved hjælp af en tvingende tilgang. Brug derefter regulære udtryk. Og endelig drager vi fordel af en mere deklarativ tilgang ved hjælp af Java 8.

Derudover vil vi diskutere Big-O-kompleksiteten af ​​de tilgange, der er taget.

2. Imperativ algoritme

Lad os implementere en tvingende algoritme. Til dette opretter vi først et besøgte boolesk array. Derefter går vi gennem inputstreng karakter for karakter og markerer tegnet som besøgt.

Bemærk, at Store bogstaver og Små bogstaver betragtes som de samme. Så indeks 0 repræsenterer både A og a, ligeledes indeks 25 repræsenterer både Z og z.

Endelig skal vi kontrollere, om alle tegn i det besøgte array er indstillet til true:

public class EnglishAlphabetLetters {public static boolean checkStringForAllTheLetters (String input) {int index = 0; boolsk [] besøgte = ny boolsk [26]; for (int id = 0; id <input.length (); id ++) {if ('a' <= input.charAt (id) && input.charAt (id) <= 'z') {index = input.charAt (id) - 'a'; } ellers hvis ('A' <= input.charAt (id) && input.charAt (id) <= 'Z') {index = input.charAt (id) - 'A'; } besøgte [indeks] = sandt; } for (int id = 0; id <26; id ++) {hvis (! besøgt [id]) {returner false; }} returner sandt; }}

Big-O-kompleksiteten af ​​dette program er O (n) hvor n er længden af ​​strengen.

Bemærk, at der er mange måder at optimere algoritmen på, såsom at fjerne bogstaver fra et sæt og bryde, så snart Sæt er tom. Med henblik på øvelsen er denne algoritme dog god nok.

3. Brug af regulært udtryk

Ved hjælp af regulært udtryk kan vi nemt få de samme resultater med et par linier kode:

public static boolean checkStringForAllLetterUsingRegex (String input) {return input.toLowerCase () .replaceAll ("[^ az]", "") .replaceAll ("(.) (? =. * \ 1)", ""). længde () == 26; }

Her fjerner vi først alle tegn undtagen alfabetbogstaver fra input. Så fjerner vi duplikattegn. Endelig tæller vi bogstaver og sørger for, at vi har dem alle, 26.

Selvom den er mindre performant, har Big-O-kompleksiteten af ​​denne tilgang også tendens til O (n).

4. Java 8 Stream

Ved hjælp af Java 8-funktioner kan vi nemt opnå det samme resultat på en mere kompakt og deklarativ måde ved hjælp af Streams filter og tydelig metoder:

offentlig statisk boolsk checkStringForAllLetterUsingStream (strengindgang) {lang c = input.toLowerCase (). tegn () .filter (ch -> ch> = 'a' && ch <= 'z'). tydelig (). antal (); returnere c == 26; }

Stor-O-kompleksitet af denne tilgang vil også være O (n).

4. Testning

Lad os teste en lykkelig sti for vores algoritme:

@Test offentlig ugyldighed givenString_whenContainsAllCharacter_thenTrue () {String sætning = "Landmand jack indså, at store gule dyner var dyre"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (sætning)); }

Her, dømme indeholder alle bogstaverne i alfabetet, derfor forventer vi rigtigt som resultat.

5. Konklusion

I denne vejledning har vi dækket, hvordan man kontrollerer, om en streng indeholder alle bogstaverne i alfabetet.

Vi så et par måder at implementere dette på først ved hjælp af traditionel tvingende programmering, regulære udtryk og Java 8-streams.

Den komplette kildekode er tilgængelig på GitHub.