From e2af9228a5e8ce947ea5f7606d3fa96d00b8be1f Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 19:25:34 +0700 Subject: [PATCH 1/6] Add com.sun.tools dependency --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index 4db680c0..3188f0ff 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,15 @@ junit-jupiter-api 5.5.1 + + + + com.sun + tools + 1.8 + system + + From 240acbb59335efce1d766d64b987a35ba2807bb5 Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 20:27:50 +0700 Subject: [PATCH 2/6] Change method name and enhance code --- .../com/ctci/arraysandstrings/IsUnique.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ctci/arraysandstrings/IsUnique.java b/src/main/java/com/ctci/arraysandstrings/IsUnique.java index 895d16b3..fb975cb9 100644 --- a/src/main/java/com/ctci/arraysandstrings/IsUnique.java +++ b/src/main/java/com/ctci/arraysandstrings/IsUnique.java @@ -6,16 +6,33 @@ */ public class IsUnique { - private static boolean hasAllUniqueCharacters(String str) { - if (str == null || str.length() > 128) return false; + /** + * Check whether the input string contains different individual characters and it in the ASCII table. + * + * @param str Input string + * @return true if all characters are different from each other, otherwise false. + */ + public static boolean isAllCharactersUniqueAndInASCII(String str) { + if (str == null || str.isEmpty()) { + return false; + } + + int maxCharIndex = 128; + int stringLength = str.length(); - boolean[] charSet = new boolean[128]; // assuming the string contains only ASCII characters - for (int i = 0; i < str.length(); i++) { - int charVal = str.charAt(i); - if (charSet[charVal]) { + if (stringLength > maxCharIndex) { + return false; + } + + boolean[] characterTrack = new boolean[maxCharIndex]; // assuming the string contains only ASCII characters + for (int i = 0; i < stringLength; i++) { + int charIndex = str.charAt(i); + if (charIndex >= maxCharIndex + || characterTrack[charIndex]) { return false; } - charSet[charVal] = true; + + characterTrack[charIndex] = true; } return true; } @@ -34,11 +51,11 @@ private static boolean hasAllUniqueCharactersWhenStringContainsAllLowercase(Stri public static void main(String[] args) { String s = "ram"; - System.out.println(hasAllUniqueCharacters(s)); + System.out.println(isAllCharactersUniqueAndInASCII(s)); s = "rama"; - System.out.println(hasAllUniqueCharacters(s)); + System.out.println(isAllCharactersUniqueAndInASCII(s)); s = "ramA"; - System.out.println(hasAllUniqueCharacters(s)); + System.out.println(isAllCharactersUniqueAndInASCII(s)); System.out.println("-------"); s = "ram"; System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s)); From 6d3e0db5dc6ef7e315a9de583ccce5cf8af7b5c5 Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 21:30:14 +0700 Subject: [PATCH 3/6] Add test case for isAllCharactersUniqueAndInASCII() --- .../ctci/arraysandstrings/IsUniqueTest.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java diff --git a/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java b/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java new file mode 100644 index 00000000..252faa64 --- /dev/null +++ b/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java @@ -0,0 +1,112 @@ +package com.ctci.arraysandstrings; + +import org.junit.jupiter.api.*; + +public class IsUniqueTest { + + @Nested + @DisplayName("Test cases for isAllCharactersUniqueAndInASCII()") + class TestCasesForIsAllCharactersUniqueAndInASCII{ + + @Test + public void isAllCharactersUniqueAndInASCII_StringIsNull_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII(null)); + } + + @Test + public void isAllCharactersUniqueAndInASCII_StringIsEmpty_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_StringLengthSmallerOrEqual128_ReturnFalse() { + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < 128; i++) { + stringBuilder.append((char) i); + } + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII(stringBuilder.toString())); + + stringBuilder.setLength(0); + for (int i = 1; i < 127; i++) { + stringBuilder.append((char) i); + } + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII(stringBuilder.toString())); + } + + @Test + public void isAllCharactersUniqueAndInASCII_StringLengthLargerThan128_ReturnFalse() { + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < 128; i++) { + stringBuilder.append((char) i); + } + stringBuilder.append("a"); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII(stringBuilder.toString())); + } + + @Test + public void isAllCharactersUniqueAndInASCII_DuplicateAtHead_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aab")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("AAb")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ááb")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ÁÁb")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("1123456")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_DuplicateAtMiddle_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("abcbd")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aBcBd")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aưcưd")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aƯcƯd")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("123436")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_DuplicateAtTail_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aba")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("AbA")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ăbă")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ĂbĂ")); + + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("1234566")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_OnlyOneCharacter_ReturnTrue() { + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("a")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("1")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("A")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("#")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_OnlyOneCharacter_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("á")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("Ô")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("€")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_InvalidString_ReturnFalse() { + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("€á")); + Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("áÂ")); + } + + @Test + public void isAllCharactersUniqueAndInASCII_ValidString_ReturnTrue() { + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("aAb")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("abcBd")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("abA")); + Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")); + } + } +} From 78d84d2845f2198840135b0a3c7189686217d570 Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 21:41:19 +0700 Subject: [PATCH 4/6] Exclude htmlReport folder --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 236a7c71..a80c53d7 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ buildNumber.properties .mvn/timing.properties !/.mvn/wrapper/maven-wrapper.jar *_Practice.java + +htmlReport/ From 4356d801604b65234fd8aac55b4ff24b3c5c33a6 Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 22:30:43 +0700 Subject: [PATCH 5/6] Change method name and enhance code --- .../com/ctci/arraysandstrings/IsUnique.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ctci/arraysandstrings/IsUnique.java b/src/main/java/com/ctci/arraysandstrings/IsUnique.java index fb975cb9..f6e91edb 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)); } } From ac5a289cc8c3f0202c5021a207e1cbfb210a3c13 Mon Sep 17 00:00:00 2001 From: Dat Mai Date: Sat, 27 Jul 2024 23:03:29 +0700 Subject: [PATCH 6/6] Add test case for isAllCharactersUniqueAndLowercaseAndInAlphabet() --- .../ctci/arraysandstrings/IsUniqueTest.java | 114 +++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java b/src/main/test/com/ctci/arraysandstrings/IsUniqueTest.java index 252faa64..ef373ded 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")); + } + } + }