From 20ac3ff55a1a21000c6752d3b39a94eebf705ffb Mon Sep 17 00:00:00 2001 From: Prerita Saini <149650718+preritasaini1@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:56:13 +0530 Subject: [PATCH 1/2] Update Pangram.java Updated the Pangram.java file by adding a bitwise approach and improving code readability --- .../com/thealgorithms/strings/Pangram.java | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/Pangram.java b/src/main/java/com/thealgorithms/strings/Pangram.java index 01307b28f6c6..052a8e4d5b9f 100644 --- a/src/main/java/com/thealgorithms/strings/Pangram.java +++ b/src/main/java/com/thealgorithms/strings/Pangram.java @@ -3,52 +3,55 @@ import java.util.HashSet; /** + * Checks if a given string is a Pangram (a sentence containing every letter of the alphabet at least once). * Wikipedia: https://en.wikipedia.org/wiki/Pangram */ public final class Pangram { + private Pangram() { } /** - * Test code + * Main method to test all pangram-checking methods. */ public static void main(String[] args) { assert isPangram("The quick brown fox jumps over the lazy dog"); assert !isPangram("The quick brown fox jumps over the azy dog"); // L is missing assert !isPangram("+-1234 This string is not alphabetical"); assert !isPangram("\u0000/\\"); + assert isPangramUsingBitwise("The quick brown fox jumps over the lazy dog"); + assert !isPangramUsingBitwise("Hello, World!"); } /** - * Checks if a String is considered a Pangram + * Checks if a String is a Pangram using a HashSet to track unique characters. * * @param s The String to check * @return {@code true} if s is a Pangram, otherwise {@code false} */ - // alternative approach using Java Collection Framework public static boolean isPangramUsingSet(String s) { - HashSet alpha = new HashSet<>(); - s = s.trim().toLowerCase(); - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) != ' ') { - alpha.add(s.charAt(i)); + HashSet uniqueChars = new HashSet<>(); + s = s.toLowerCase(); + for (char c : s.toCharArray()) { + if (c >= 'a' && c <= 'z') { + uniqueChars.add(c); } } - return alpha.size() == 26; + return uniqueChars.size() == 26; } /** - * Checks if a String is considered a Pangram + * Checks if a String is a Pangram by tracking occurrences of each letter in an array. * * @param s The String to check * @return {@code true} if s is a Pangram, otherwise {@code false} */ public static boolean isPangram(String s) { boolean[] lettersExisting = new boolean[26]; + s = s.toLowerCase(); for (char c : s.toCharArray()) { - int letterIndex = c - (Character.isUpperCase(c) ? 'A' : 'a'); - if (letterIndex >= 0 && letterIndex < lettersExisting.length) { - lettersExisting[letterIndex] = true; + if (c >= 'a' && c <= 'z') { + lettersExisting[c - 'a'] = true; } } for (boolean letterFlag : lettersExisting) { @@ -60,7 +63,7 @@ public static boolean isPangram(String s) { } /** - * Checks if a String is Pangram or not by checking if each alhpabet is present or not + * Checks if a String is a Pangram by checking each letter in the alphabet individually. * * @param s The String to check * @return {@code true} if s is a Pangram, otherwise {@code false} @@ -69,12 +72,32 @@ public static boolean isPangram2(String s) { if (s.length() < 26) { return false; } - s = s.toLowerCase(); // Converting s to Lower-Case + s = s.toLowerCase(); for (char i = 'a'; i <= 'z'; i++) { if (s.indexOf(i) == -1) { - return false; // if any alphabet is not present, return false + return false; // if any alphabet is missing, return false } } return true; } + + /** + * Optimized Pangram check using Bitwise operations. + * Each bit in a 32-bit integer represents a unique letter from 'a' to 'z'. + * + * @param s The String to check + * @return {@code true} if s is a Pangram, otherwise {@code false} + */ + public static boolean isPangramUsingBitwise(String s) { + int checker = 0; + s = s.toLowerCase(); + for (char c : s.toCharArray()) { + if (c >= 'a' && c <= 'z') { + int bitIndex = c - 'a'; + checker |= (1 << bitIndex); + } + } + // If all 26 bits are set, checker will equal 0b11111111111111111111111111 (26 ones) + return checker == (1 << 26) - 1; + } } From bb8cb72bef5619da082d31ff4147b0e2a7ee26cb Mon Sep 17 00:00:00 2001 From: Prerita Saini <149650718+preritasaini1@users.noreply.github.com> Date: Tue, 29 Oct 2024 23:40:34 +0530 Subject: [PATCH 2/2] Update Pangram.java --- .../com/thealgorithms/strings/Pangram.java | 123 ++++-------------- 1 file changed, 28 insertions(+), 95 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/Pangram.java b/src/main/java/com/thealgorithms/strings/Pangram.java index 052a8e4d5b9f..bf6bfabcaa5a 100644 --- a/src/main/java/com/thealgorithms/strings/Pangram.java +++ b/src/main/java/com/thealgorithms/strings/Pangram.java @@ -1,103 +1,36 @@ -package com.thealgorithms.strings; - -import java.util.HashSet; - -/** - * Checks if a given string is a Pangram (a sentence containing every letter of the alphabet at least once). - * Wikipedia: https://en.wikipedia.org/wiki/Pangram - */ -public final class Pangram { - - private Pangram() { - } - - /** - * Main method to test all pangram-checking methods. - */ - public static void main(String[] args) { - assert isPangram("The quick brown fox jumps over the lazy dog"); - assert !isPangram("The quick brown fox jumps over the azy dog"); // L is missing - assert !isPangram("+-1234 This string is not alphabetical"); - assert !isPangram("\u0000/\\"); - assert isPangramUsingBitwise("The quick brown fox jumps over the lazy dog"); - assert !isPangramUsingBitwise("Hello, World!"); - } - - /** - * Checks if a String is a Pangram using a HashSet to track unique characters. - * - * @param s The String to check - * @return {@code true} if s is a Pangram, otherwise {@code false} - */ - public static boolean isPangramUsingSet(String s) { - HashSet uniqueChars = new HashSet<>(); - s = s.toLowerCase(); - for (char c : s.toCharArray()) { - if (c >= 'a' && c <= 'z') { - uniqueChars.add(c); - } - } - return uniqueChars.size() == 26; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class PangramTest { + + @Test + public void testIsPangram() { + assertTrue(Pangram.isPangram("The quick brown fox jumps over the lazy dog")); + assertFalse(Pangram.isPangram("The quick brown fox jumps over the azy dog")); // L is missing + assertFalse(Pangram.isPangram("+-1234 This string is not alphabetical")); + assertFalse(Pangram.isPangram("\u0000/\\")); } - /** - * Checks if a String is a Pangram by tracking occurrences of each letter in an array. - * - * @param s The String to check - * @return {@code true} if s is a Pangram, otherwise {@code false} - */ - public static boolean isPangram(String s) { - boolean[] lettersExisting = new boolean[26]; - s = s.toLowerCase(); - for (char c : s.toCharArray()) { - if (c >= 'a' && c <= 'z') { - lettersExisting[c - 'a'] = true; - } - } - for (boolean letterFlag : lettersExisting) { - if (!letterFlag) { - return false; - } - } - return true; + @Test + public void testIsPangramUsingSet() { + assertTrue(Pangram.isPangramUsingSet("The quick brown fox jumps over the lazy dog")); + assertFalse(Pangram.isPangramUsingSet("The quick brown fox jumps over the azy dog")); // L is missing + assertFalse(Pangram.isPangramUsingSet("+-1234 This string is not alphabetical")); + assertFalse(Pangram.isPangramUsingSet("\u0000/\\")); } - /** - * Checks if a String is a Pangram by checking each letter in the alphabet individually. - * - * @param s The String to check - * @return {@code true} if s is a Pangram, otherwise {@code false} - */ - public static boolean isPangram2(String s) { - if (s.length() < 26) { - return false; - } - s = s.toLowerCase(); - for (char i = 'a'; i <= 'z'; i++) { - if (s.indexOf(i) == -1) { - return false; // if any alphabet is missing, return false - } - } - return true; + @Test + public void testIsPangram2() { + assertTrue(Pangram.isPangram2("The quick brown fox jumps over the lazy dog")); + assertFalse(Pangram.isPangram2("The quick brown fox jumps over the azy dog")); // L is missing + assertFalse(Pangram.isPangram2("+-1234 This string is not alphabetical")); + assertFalse(Pangram.isPangram2("\u0000/\\")); } - /** - * Optimized Pangram check using Bitwise operations. - * Each bit in a 32-bit integer represents a unique letter from 'a' to 'z'. - * - * @param s The String to check - * @return {@code true} if s is a Pangram, otherwise {@code false} - */ - public static boolean isPangramUsingBitwise(String s) { - int checker = 0; - s = s.toLowerCase(); - for (char c : s.toCharArray()) { - if (c >= 'a' && c <= 'z') { - int bitIndex = c - 'a'; - checker |= (1 << bitIndex); - } - } - // If all 26 bits are set, checker will equal 0b11111111111111111111111111 (26 ones) - return checker == (1 << 26) - 1; + @Test + public void testIsPangramUsingBitwise() { + assertTrue(Pangram.isPangramUsingBitwise("The quick brown fox jumps over the lazy dog")); + assertFalse(Pangram.isPangramUsingBitwise("Hello, World!")); } }