Periksa Jika String Berisi Semua Huruf Alfabet dengan Java

1. Ikhtisar

Dalam tutorial ini, kita akan melihat bagaimana memeriksa apakah String berisi semua huruf alfabet atau tidak.

Berikut adalah contoh singkatnya : “ Farmer jack menyadari bahwa selimut kuning besar itu mahal. ”- yang sebenarnya berisi semua huruf dalam alfabet.

Kami akan membahas tiga pendekatan.

Pertama, kita akan memodelkan algoritme menggunakan pendekatan imperatif. Kemudian akan menggunakan ekspresi reguler. Dan terakhir, kita akan memanfaatkan pendekatan yang lebih deklaratif menggunakan Java 8.

Selain itu, kami akan membahas Big-O-kompleksitas dari pendekatan yang diambil.

2. Algoritma Imperatif

Mari terapkan algoritme imperatif. Untuk ini, pertama, kita akan membuat array boolean yang dikunjungi. Kemudian, kita akan menelusuri input string karakter demi karakter dan menandai karakter tersebut sebagai telah dikunjungi.

Harap dicatat bahwa Huruf Besar dan Huruf Kecil dianggap sama. Jadi indeks 0 mewakili A dan a, demikian juga indeks 25 mewakili Z dan z.

Terakhir, kami akan memeriksa apakah semua karakter dalam array yang dikunjungi disetel ke 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; } }

Kompleksitas Big-O dari program ini adalah O (n) dimana n adalah panjang string.

Perhatikan bahwa ada banyak cara untuk mengoptimalkan algoritme, seperti menghapus huruf dari kumpulan dan memutusnya segera setelah Kumpulan kosong. Untuk tujuan latihan, algoritma ini cukup baik.

3. Menggunakan Ekspresi Reguler

Dengan menggunakan ekspresi Reguler, kita bisa dengan mudah mendapatkan hasil yang sama dengan beberapa baris kode:

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

Di sini, pertama-tama kita menghilangkan semua karakter kecuali huruf alfabet dari input . Kemudian kami menghapus karakter duplikat. Terakhir, kami menghitung huruf dan memastikan kami memiliki semuanya, 26.

Meskipun performanya kurang, Big-O-Complexity dari pendekatan ini juga cenderung ke O (n).

4. Aliran Java 8

Dengan menggunakan fitur Java 8, kita dapat dengan mudah mencapai hasil yang sama dengan cara yang lebih ringkas dan deklaratif menggunakan filter Stream dan metode berbeda :

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

Kompleksitas Big-O dari pendekatan ini juga akan menjadi O (n).

4. Pengujian

Mari kita uji jalur bahagia untuk algoritma kita:

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

Di sini, kalimat berisi semua huruf alfabet, oleh karena itu, kami mengharapkan true sebagai hasilnya.

5. Kesimpulan

Dalam tutorial ini, kami telah membahas cara memeriksa apakah String berisi semua huruf alfabet .

Kami melihat beberapa cara untuk mengimplementasikan ini terlebih dahulu menggunakan pemrograman imperatif tradisional, ekspresi reguler, dan aliran Java 8.

Kode sumber lengkap tersedia di GitHub.