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?


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"));
  }
}

No comments:

Post a Comment