Skip to content

Commit a051a1a

Browse files
committed
2 parents 78d84d2 + 6dfb79f commit a051a1a

File tree

2 files changed

+139
-10
lines changed

2 files changed

+139
-10
lines changed

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

+27-10
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,33 @@
66
*/
77
public class IsUnique {
88

9-
private static boolean hasAllUniqueCharacters(String str) {
10-
if (str == null || str.length() > 128) return false;
9+
/**
10+
* Check whether the input string contains different individual characters and it in the ASCII table.
11+
*
12+
* @param str Input string
13+
* @return true if all characters are different from each other, otherwise false.
14+
*/
15+
public static boolean isAllCharactersUniqueAndInASCII(String str) {
16+
if (str == null || str.isEmpty()) {
17+
return false;
18+
}
19+
20+
int maxCharIndex = 128;
21+
int stringLength = str.length();
1122

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]) {
23+
if (stringLength > maxCharIndex) {
24+
return false;
25+
}
26+
27+
boolean[] characterTrack = new boolean[maxCharIndex]; // assuming the string contains only ASCII characters
28+
for (int i = 0; i < stringLength; i++) {
29+
int charIndex = str.charAt(i);
30+
if (charIndex >= maxCharIndex
31+
|| characterTrack[charIndex]) {
1632
return false;
1733
}
18-
charSet[charVal] = true;
34+
35+
characterTrack[charIndex] = true;
1936
}
2037
return true;
2138
}
@@ -34,11 +51,11 @@ private static boolean hasAllUniqueCharactersWhenStringContainsAllLowercase(Stri
3451

3552
public static void main(String[] args) {
3653
String s = "ram";
37-
System.out.println(hasAllUniqueCharacters(s));
54+
System.out.println(isAllCharactersUniqueAndInASCII(s));
3855
s = "rama";
39-
System.out.println(hasAllUniqueCharacters(s));
56+
System.out.println(isAllCharactersUniqueAndInASCII(s));
4057
s = "ramA";
41-
System.out.println(hasAllUniqueCharacters(s));
58+
System.out.println(isAllCharactersUniqueAndInASCII(s));
4259
System.out.println("-------");
4360
s = "ram";
4461
System.out.println(hasAllUniqueCharactersWhenStringContainsAllLowercase(s));
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 isAllCharactersUniqueAndInASCII()")
9+
class TestCasesForIsAllCharactersUniqueAndInASCII{
10+
11+
@Test
12+
public void isAllCharactersUniqueAndInASCII_StringIsNull_ReturnFalse() {
13+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII(null));
14+
}
15+
16+
@Test
17+
public void isAllCharactersUniqueAndInASCII_StringIsEmpty_ReturnFalse() {
18+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII(""));
19+
}
20+
21+
@Test
22+
public void isAllCharactersUniqueAndInASCII_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.isAllCharactersUniqueAndInASCII(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.isAllCharactersUniqueAndInASCII(stringBuilder.toString()));
35+
}
36+
37+
@Test
38+
public void isAllCharactersUniqueAndInASCII_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.isAllCharactersUniqueAndInASCII(stringBuilder.toString()));
47+
}
48+
49+
@Test
50+
public void isAllCharactersUniqueAndInASCII_DuplicateAtHead_ReturnFalse() {
51+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aab"));
52+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("AAb"));
53+
54+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ááb"));
55+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ÁÁb"));
56+
57+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("1123456"));
58+
}
59+
60+
@Test
61+
public void isAllCharactersUniqueAndInASCII_DuplicateAtMiddle_ReturnFalse() {
62+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("abcbd"));
63+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aBcBd"));
64+
65+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aưcưd"));
66+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aƯcƯd"));
67+
68+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("123436"));
69+
}
70+
71+
@Test
72+
public void isAllCharactersUniqueAndInASCII_DuplicateAtTail_ReturnFalse() {
73+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("aba"));
74+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("AbA"));
75+
76+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ăbă"));
77+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ĂbĂ"));
78+
79+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("1234566"));
80+
}
81+
82+
@Test
83+
public void isAllCharactersUniqueAndInASCII_OnlyOneCharacter_ReturnTrue() {
84+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("a"));
85+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("1"));
86+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("A"));
87+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("#"));
88+
}
89+
90+
@Test
91+
public void isAllCharactersUniqueAndInASCII_OnlyOneCharacter_ReturnFalse() {
92+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("á"));
93+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("Ô"));
94+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("€"));
95+
}
96+
97+
@Test
98+
public void isAllCharactersUniqueAndInASCII_InvalidString_ReturnFalse() {
99+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("ۇ"));
100+
Assertions.assertFalse(IsUnique.isAllCharactersUniqueAndInASCII("áÂ"));
101+
}
102+
103+
@Test
104+
public void isAllCharactersUniqueAndInASCII_ValidString_ReturnTrue() {
105+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("aAb"));
106+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("abcBd"));
107+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII("abA"));
108+
Assertions.assertTrue(IsUnique.isAllCharactersUniqueAndInASCII(
109+
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)