2012-04-13 3 views
0

問題は、指定された文字列に重複する文字がないかどうかを調べることです。文字列には文字a-z(小文字のみ)が含まれているという制約があります。O(n)時間およびO(1)メモリ内の文字列に重複があり、データ構造がないことを検出する

明白な解決策は、遭遇した文字を追跡するために配列(またはハッシュテーブル)を使用することです。しかし問題は、データ構造を使用することが許されていないことです。

この問題の解決策の1つは次のとおりです。しかし、私はそれがどのように機能しているのかよく分かりません。私はそれが遭遇する文字を追跡するために整数のビットを使用していることがわかります。

public boolean isUniqueChars(String str) { 
    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; 
} 

答えて

1

各文字のビット数が正しく設定されています。しかし、最初に(bitwiseと)を使用してチェックし、現在の文字がすでに見つかっている場合は、その文字列に一意の文字が含まれていないことを認識します。

0

私は説明しようとします。 int checker;は32ビット表現です。 a-zは合計26文字であるため、32ビット(1の整数型データ)は使用された文字にフラグを付けるのに十分です。 checker |= (1 << val);がa-z文字にフラグを付けるために使用されています。多分それはあなたを助けることができます:)

関連する問題