import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
* Implement an algorithm to determine if a string has all unique characters.
* What if you can not use additional data structures? What if you have to use
* bit masking to track occurrences?
*/
public class StringHasAllUniqueCharacters extends TestCase {
public static boolean hasAllUniqueCharacters(String string) {
Map<Character, Boolean> charactersMap = new HashMap<Character, Boolean>();
for (char c : string.toCharArray()) {
if (charactersMap.containsKey(c)) {
return false;
}
charactersMap.put(c, true);
}
return true;
}
public static boolean hasAllUniqueCharactersNoHelperDS(String string) {
final int length = string.length();
for (int i = 0; i < length; i++) {
final char c = string.charAt(i);
for (int j = i + 1; j < length; j++) {
if (c == string.charAt(j)) {
return false;
}
}
}
return true;
}
public static boolean hasAllUniqueCharactersUsingBitMasking(String string) {
final int length = string.length();
final int nBitsToStoreAllUnicodeCharacters =
(int) Math.ceil(Math.log(Character.MAX_CODE_POINT) / Math.log(2d));
BitSet bitSet = new BitSet(nBitsToStoreAllUnicodeCharacters);
for (int i = 0; i < length; i++) {
char c = string.charAt(i);
if (bitSet.get(c)) {
return false;
}
bitSet.set(c);
}
return true;
}
public static void testHasAllUniqueCharacters() {
assertTrue(hasAllUniqueCharacters(""));
assertTrue(hasAllUniqueCharacters("a"));
assertFalse(hasAllUniqueCharacters("aa"));
assertTrue(hasAllUniqueCharacters("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
public static void testHasAllUniqueCharactersNoAdditionalDS() {
assertTrue(hasAllUniqueCharacters(""));
assertTrue(hasAllUniqueCharacters("a"));
assertFalse(hasAllUniqueCharacters("aa"));
assertTrue(hasAllUniqueCharacters("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
public static void testHasAllUniqueCharactersUsingBitMasking() {
assertTrue(hasAllUniqueCharactersUsingBitMasking(""));
assertTrue(hasAllUniqueCharactersUsingBitMasking("a"));
assertFalse(hasAllUniqueCharactersUsingBitMasking("aa"));
assertTrue(hasAllUniqueCharactersUsingBitMasking("as"));
assertFalse(hasAllUniqueCharacters("abcde a"));
}
}
Wednesday, August 15, 2012
Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures? What if you have to use bit masking to track occurrences?
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment