בדוק אם מחרוזת מכילה את כל אותיות האלף-בית עם ג'אווה

1. סקירה כללית

במדריך זה נראה כיצד לבדוק אם מחרוזת מכילה את כל אותיות האלף-בית או לא.

הנה דוגמה מהירה: “ג'ק האיכר הבין ששמיכות טלאים צהובות גדולות היו יקרות.”- אשר מכיל למעשה את כל אותיות האלף-בית.

נדון בשלוש גישות.

ראשית, נעבד את האלגוריתם באמצעות גישה חובה. ואז ישתמש בביטויים רגולריים. ולבסוף, ננצל גישה הצהרתית יותר באמצעות Java 8.

בנוסף נדון במורכבות הביג-או של הגישות שננקטו.

2. אלגוריתם הכרחי

בואו נשתמש באלגוריתם הכרחי. לשם כך, ראשית, ניצור מערך בוליאני שביקר. לאחר מכן, נעבור דרך מחרוזת קלט תו אחר דמות ונסמן את הדמות כביקרה.

שים לב ש אותיות רישיות ו אותיות קטנות נחשבים זהים. אז אינדקס 0 מייצג גם A וגם a, כמו כן, אינדקס 25 מייצג גם Z וגם z.

לבסוף נבדוק אם כל התווים במערך שביקר מוגדרים כ- true:

class public EnglishAlphabetLetters {ציבורי בוליאני סטטי ציבוריStringForAllTheLetters (קלט מחרוזת) {int index = 0; בוליאני [] ביקר = בוליאני חדש [26]; עבור (int id = 0; id <input.length (); id ++) {if ('a' <= input.charAt (id) && input.charAt (id) <= 'z') {index = input.charAt (id) - 'a'; } אחר אם ('A' <= input.charAt (id) && input.charAt (id) <= 'Z') {index = input.charAt (id) - 'A'; } ביקר [index] = נכון; } עבור (int id = 0; id <26; id ++) {if (! ביקרה [id]) {return false; }} להחזיר אמת; }}

המורכבות הגדולה של התוכנית הזו היא O (n) איפה נ הוא אורך המיתר.

שים לב שישנן דרכים רבות לבצע אופטימיזציה של האלגוריתם, כגון הסרת אותיות מסט ושבירה ברגע שה- מַעֲרֶכֶת זה ריק. לצורך התרגיל, אלגוריתם זה מספיק טוב.

3. שימוש בביטוי רגולרי

באמצעות ביטוי רגולרי, אנו יכולים להשיג את אותן התוצאות בקלות בכמה שורות קוד:

check בוליאני סטטי ציבוריStringForAllLetterUsingRegex (קלט מחרוזת) {return input.toLowerCase () .replaceAll ("[^ az]", "") .replaceAll ("(.) (? =. * \ 1)", ""). אורך () == 26; }

כאן אנו מבטלים תחילה את כל התווים למעט אותיות האלף-בית קֶלֶט. ואז אנו מסירים תווים כפולים. לבסוף, אנו סופרים אותיות ומוודאים שיש לנו את כולם, 26.

למרות שביצועים פחות גדולים, ביג-או-מורכבות של גישה זו נוטה גם ל- O (n).

4. ג'אווה 8 זרם

באמצעות תכונות Java 8, אנו יכולים להשיג את אותה התוצאה בקלות בצורה קומפקטית והצהרתית יותר באמצעות Stream's לְסַנֵן ו מוּבהָק שיטות:

check בוליאני סטטי ציבוריStringForAllLetterUsingStream (קלט מחרוזת) {long c = input.toLowerCase (). chars () .filter (ch -> ch> = 'a' && ch <= 'z') .distinct () .count (); החזר c == 26; }

המורכבות הגדולה-או של גישה זו תהיה גם O (n).

4. בדיקות

בואו לבדוק נתיב משמח לאלגוריתם שלנו:

@ מבחן בטל פומבי givenString_whenContainsAllCharacter_thenTrue () {משפט מחרוזת = "ג'ק חקלאי הבין ששמיכות טלאים צהובות גדולות היו יקרות"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (משפט)); }

פה, משפט מכיל את כל אותיות האלף-בית, ולכן אנו מצפים נָכוֹן כתוצאה.

5. מסקנה

במדריך זה סקרנו כיצד לבדוק אם מחרוזת מכילה את כל אותיות האלף-בית.

ראינו כמה דרכים ליישם זאת באמצעות תכנות חובה מסורתיות, ביטויים רגולריים וזרמי Java 8.

קוד המקור השלם זמין ב- GitHub.