簡體   English   中英

實現一種算法,以使用位旋轉來確定字符串是否具有所有唯一字符

[英]Implement an algorithm to determine if a string has all unique characters using bit twiddling

我如何最好地實現一個Java函數,該函數接受String參數並根據字符串是否由所有不同字符組成而返回truefalse

這是一個面試問題。 該實現應使用位掩碼來存儲字符的出現,而不能使用其他輔助數據結構。

注意:使用位屏蔽的要求使此問題不同於:

根據要求,這是我到目前為止的努力。 如果可能的話,請重新打開問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM