diff --git a/src/main/java/com/ctci/arraysandstrings/IsUnique.java b/src/main/java/com/ctci/arraysandstrings/IsUnique.java index fb975cb..f6e91ed 100644 --- a/src/main/java/com/ctci/arraysandstrings/IsUnique.java +++ b/src/main/java/com/ctci/arraysandstrings/IsUnique.java @@ -37,14 +37,37 @@ public static boolean isAllCharactersUniqueAndInASCII(String str) { return true; } - private static boolean hasAllUniqueCharactersWhenStringContainsAllLowercase(String s) { + /** + * Check whether the input string contains different individual characters, lowercase + * and in between 'a' and 'z' + * + * @param str Input string + * @return true if all characters are different from each other,lowercase and between 'a' and 'z', otherwise false. + */ + public static boolean isAllCharactersUniqueAndLowercaseAndInAlphabet(String str) { + if (str == null + || str.isEmpty() + || str.length() > 26) { + return false; + } + int checker = 0; - for (int i = 0; i < s.length(); i++) { - int charValue = s.charAt(i) - 'a'; - if ((checker & (1 << charValue)) > 0) { + int stringLength = str.length(); + for (int i = 0; i < stringLength; i++) { + + char character = str.charAt(i); + if (!(character >= 'a' && character <= 'z')) { return false; } - checker |= (1 << charValue); + + int characterIndex = character - 'a'; + int singleBitOnPosition = 1 << characterIndex ; + + if ((checker & singleBitOnPosition) > 0) { + return false; + } + + checker |= singleBitOnPosition; // checker = checker | singleBitOnPosition; } return true; } @@ -58,11 +81,11 @@ public static void main(String[] args) { System.out.println(isAllCharactersUniqueAndInASCII(s)); System.out.println("-------"); s = "ram"; - System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s)); + System.out.println(isAllCharactersUniqueAndLowercaseAndInAlphabet(s)); s = "rama"; - System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s)); + System.out.println(isAllCharactersUniqueAndLowercaseAndInAlphabet(s)); // not working as the input contains different cases s = "ramA"; - System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s)); + System.out.println(isAllCharactersUniqueAndLowercaseAndInAlphabet(s)); } } diff --git a/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java b/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java index 252faa6..ef373de 100644 --- a/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java +++ b/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java @@ -6,7 +6,7 @@ public class IsUniqueTest { @Nested @DisplayName("Test cases for isAllCharactersUniqueAndInASCII()") - class TestCasesForIsAllCharactersUniqueAndInASCII{ + class TestCasesForIsAllCharactersUniqueAndInASCII { @Test public void isAllCharactersUniqueAndInASCII_StringIsNull_ReturnFalse() { @@ -109,4 +109,116 @@ public void isAllCharactersUniqueAndInASCII_ValidString_ReturnTrue() { "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")); } } + + @Nested + @DisplayName("Test cases for isAllCharactersUniqueAndLowercaseAndInAlphabet()") + class TestCasesForIsAllCharactersUniqueAndLowercaseAndInAlphabet { + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_StringIsNull_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(null)); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_StringIsEmpty_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_StringLengthSmallerOrEqual26_ReturnFalse() { + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 97; i <= 122; i++) { // 'a' -> 'z' + stringBuilder.append((char) i); + } + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(stringBuilder.toString())); + + stringBuilder.setLength(0); + for (int i = 100; i <= 120; i++) { // 'a' -> 'z' + stringBuilder.append((char) i); + } + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(stringBuilder.toString())); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_StringLengthLargerThan26_ReturnFalse() { + String a2z = "abcdefghijklmnopqrstuvwxyz"; + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(a2z + (char) 96)); // 96 => ` + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(a2z + (char) 123)); // 123 => { + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_Beyond_a2z_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("GH@")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("{} ")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ááb")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ÁÁb")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("1123456")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_DuplicateAtHead_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aab")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("AAb")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ááb")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ÁÁb")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("1123456")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_DuplicateAtMiddle_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("abcbd")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aBcBd")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aưcưd")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aƯcƯd")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("123436")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_DuplicateAtTail_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aba")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("AbA")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ăbă")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("ĂbĂ")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("1234566")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_OnlyOneCharacter_ReturnTrue() { + for (int i = 97; i <= 122; i++) { + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet(String.valueOf((char) i))); + } + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_OnlyOneCharacter_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("A")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("á")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("Ô")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("€")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_InvalidString_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("€á")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("áÂ")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("aB")); + } + + @Test + public void isAllCharactersUniqueAndLowercaseAndInAlphabet_ValidString_ReturnTrue() { + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("mwq")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("fwoklt")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndLowercaseAndInAlphabet("abcdefghijklmnopqrstuvwxyz")); + } + } + }