Skip to content

Commit f95c0d1

Browse files
authored
Merge pull request #2 from DatMV01/test/add-unittest-for-hasAllUniqueCharacters
Add unit test for hasAllUniqueCharacters() method
2 parents 9a234ad + 3afb0a3 commit f95c0d1

File tree

2 files changed

+163
-10
lines changed

2 files changed

+163
-10
lines changed

src/main/java/com/ctci/arraysandstrings/IsUnique.java

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,62 @@
11
package com.ctci.arraysandstrings;
22

3+
import java.util.HashSet;
4+
import java.util.Set;
5+
36
/**
47
* @author rampatra
58
* @since 18/11/2018
69
*/
710
public class IsUnique {
811

9-
private static boolean hasAllUniqueCharacters(String str) {
10-
if (str == null || str.length() > 128) return false;
12+
/**
13+
* Check whether the input string contains different individual characters in the ASCII table.
14+
*
15+
* @param inputString Input string
16+
* @return true if all characters are different from each other, otherwise false.
17+
*/
18+
public static boolean hasDifferentIndividualCharacters(String inputString) {
19+
int maxCharacterDecimal = 128;
20+
21+
if (inputString == null
22+
|| inputString.isEmpty()
23+
|| inputString.length() > maxCharacterDecimal) {
24+
return false;
25+
}
26+
27+
boolean[] characterTrack = new boolean[maxCharacterDecimal];
28+
29+
int inputStringLength = inputString.length();
30+
for (int i = 0; i < inputStringLength; i++) {
31+
int charInDecimal = inputString.charAt(i);
32+
33+
if (charInDecimal >= maxCharacterDecimal
34+
|| characterTrack[charInDecimal]) {
35+
return false;
36+
}
37+
38+
characterTrack[charInDecimal] = true;
39+
}
40+
return true;
41+
}
42+
43+
/**
44+
* Check whether the input string contains different individual characters.
45+
*
46+
* @param inputString Input string
47+
* @return true if all characters are different from each other, otherwise false.
48+
*/
49+
public static boolean hasAllUniqueCharactersEnhancement(String inputString) {
50+
if (inputString == null || inputString.isEmpty()) {
51+
return false;
52+
}
1153

12-
boolean[] charSet = new boolean[128]; // assuming the string contains only ASCII characters
13-
for (int i = 0; i < str.length(); i++) {
14-
int charVal = str.charAt(i);
15-
if (charSet[charVal]) {
54+
Set<Character> charSet = new HashSet<>();
55+
char[] inputStingArr = inputString.toCharArray();
56+
for (char c : inputStingArr) {
57+
if (!charSet.add(c)) {
1658
return false;
1759
}
18-
charSet[charVal] = true;
1960
}
2061
return true;
2162
}
@@ -34,11 +75,11 @@ private static boolean hasAllUniqueCharactersWhenStringContainsAllLowercase(Stri
3475

3576
public static void main(String[] args) {
3677
String s = "ram";
37-
System.out.println(hasAllUniqueCharacters(s));
78+
System.out.println(hasDifferentIndividualCharacters(s));
3879
s = "rama";
39-
System.out.println(hasAllUniqueCharacters(s));
80+
System.out.println(hasDifferentIndividualCharacters(s));
4081
s = "ramA";
41-
System.out.println(hasAllUniqueCharacters(s));
82+
System.out.println(hasDifferentIndividualCharacters(s));
4283
System.out.println("-------");
4384
s = "ram";
4485
System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s));
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.ctci.arraysandstrings;
2+
3+
import org.junit.jupiter.api.*;
4+
5+
public class IsUniqueTest {
6+
7+
@Nested
8+
@DisplayName("Test cases for hasDifferentIndividualCharacters() method")
9+
class TestCasesForHasDifferentIndividualCharacters {
10+
11+
@Test
12+
public void testHasDifferentIndividualCharacters_StringIsNull_ReturnFalse() {
13+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters(null));
14+
}
15+
16+
@Test
17+
public void testHasDifferentIndividualCharacters_StringIsEmpty_ReturnFalse() {
18+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters(""));
19+
}
20+
21+
@Test
22+
public void testHasDifferentIndividualCharacters_StringLengthSmallerOrEqual128_ReturnFalse() {
23+
StringBuilder stringBuilder = new StringBuilder();
24+
25+
for (int i = 0; i < 128; i++) {
26+
stringBuilder.append((char) i);
27+
}
28+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters(stringBuilder.toString()));
29+
30+
stringBuilder.setLength(0);
31+
for (int i = 1; i < 127; i++) {
32+
stringBuilder.append((char) i);
33+
}
34+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters(stringBuilder.toString()));
35+
}
36+
37+
@Test
38+
public void testHasDifferentIndividualCharacters_StringLengthLargerThan128_ReturnFalse() {
39+
StringBuilder stringBuilder = new StringBuilder();
40+
41+
for (int i = 0; i < 128; i++) {
42+
stringBuilder.append((char) i);
43+
}
44+
stringBuilder.append("a");
45+
46+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters(stringBuilder.toString()));
47+
}
48+
49+
@Test
50+
public void testHasDifferentIndividualCharacters_DuplicateAtHead_ReturnFalse() {
51+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("aab"));
52+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("AAb"));
53+
54+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("ááb"));
55+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("ÁÁb"));
56+
57+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("1123456"));
58+
}
59+
60+
@Test
61+
public void testHasDifferentIndividualCharacters_DuplicateAtMiddle_ReturnFalse() {
62+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("abcbd"));
63+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("aBcBd"));
64+
65+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("aưcưd"));
66+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("aƯcƯd"));
67+
68+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("123436"));
69+
}
70+
71+
@Test
72+
public void testHasDifferentIndividualCharacters_DuplicateAtTail_ReturnFalse() {
73+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("aba"));
74+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("AbA"));
75+
76+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("ăbă"));
77+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("ĂbĂ"));
78+
79+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("1234566"));
80+
}
81+
82+
@Test
83+
public void testHasDifferentIndividualCharacters_OnlyOneCharacter_ReturnTrue() {
84+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("a"));
85+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("1"));
86+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("A"));
87+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("#"));
88+
}
89+
90+
@Test
91+
public void testHasDifferentIndividualCharacters_OnlyOneCharacter_ReturnFalse() {
92+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("á"));
93+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("Ô"));
94+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("€"));
95+
}
96+
97+
@Test
98+
public void testHasDifferentIndividualCharacters_InvalidString_ReturnFalse() {
99+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("ۇ"));
100+
Assertions.assertFalse(IsUnique.hasDifferentIndividualCharacters("áÂ"));
101+
}
102+
103+
@Test
104+
public void testHasDifferentIndividualCharacters_ValidString_ReturnTrue() {
105+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("aAb"));
106+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("abcBd"));
107+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters("abA"));
108+
Assertions.assertTrue(IsUnique.hasDifferentIndividualCharacters(
109+
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)