[英]Implement an algorithm to determine if a string has all unique characters using bit twiddling
我如何最好地實現一個Java函數,該函數接受String參數並根據字符串是否由所有不同字符組成而返回true
或false
。
這是一個面試問題。 該實現應使用位掩碼來存儲字符的出現,而不能使用其他輔助數據結構。
注意:使用位屏蔽的要求使此問題不同於:
根據要求,這是我到目前為止的努力。 如果可能的話,請重新打開問題:
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 boolean isUniqueChars(String str) {
if (str.length() > 256) {
return false;
}
int checker = 0;
for (int i = 0; i < str.length(); ++i) {
int val = str.charAt(i) - ‘a’;
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
}
return true;
}
這是在Java中使用BitSet類的另一種解決方案。 該程序適用於ASCII字符集字符串,並且不限制該字符串必須為小寫或大寫。 此外,使用BitSet類可以輕松使用和理解按位操作。
public static boolean isUniqueStringUsingBitVectorClass(String s) {
final int ASCII_CHARACTER_SET_SIZE = 256;
final BitSet tracker = new BitSet(ASCII_CHARACTER_SET_SIZE);
// if more than 256 ASCII characters then there can't be unique characters
if(s.length() > 256) {
return false;
}
//this will be used to keep the location of each character in String
final BitSet charBitLocation = new BitSet(ASCII_CHARACTER_SET_SIZE);
for(int i = 0; i < s.length(); i++) {
int charVal = s.charAt(i);
charBitLocation.set(charVal);
if(tracker.intersects(charBitLocation)) {
return false;
}
tracker.or(charBitLocation);
charBitLocation.clear(); //clear the individual character tracker for next iteration in the loop
}
return true;
}
public static boolean isUniqueCharsBitSet(String str) {
if (str.length() > 256) {
return false;
}
BitSet set = new BitSet();
for (int i = 0; i < str.length(); ++i) {
int val = str.charAt(i) - 'a';
if (!(set.get(val))) {
set.set(val);
} else {
return false;
}
}
return true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.