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