2017-06-30 23 views
2
public static boolean uniqueCheck(String s) 
{ 
    int checker=0,val=0; 
    for (int i = 0; i < s.length(); i++) { 
     val=s.charAt(i)-'a'; 
     if ((checker & (1<< val))>0) return false; 
     checker |= (1<<val); 
    } 
    return true; 
} 

このコードがspace()を無視して一意の文字に対してtrueを返す方法を知りたいと思います。 例:"a b c d"がtrueを返します。空白にもUni​​code値があり、スペースが2回発生するとfalseを返す必要があります。何故なの??文字列内の一意の文字を確認する(java)

+0

あなたは何をしたいのかをよく説明してください。 s.charAt(i) - 'a'は 'if-statement 'が失敗する理由は負であるため、コードは' aa'には適していますが ''(2スペース)には失敗します。 – SubOptimal

答えて

-1

あなたが交換するreplaceAll()を使用する必要がありますstringのすべての空白(または指定した他の文字)

2

1 << (' ' - 'a')が負であるので、ビットマスクで抽出されたint型ためです:

(checker & (1 << val)) 

も負です。

変更しかし

if ((checker & (1<< val)) != 0) return false; 
         // ^^ Here. 

への条件:あなたがcharの前の検出を示すために使用する32ビットのみを持っている、とvalの65536の可能な値があります。この方法は非常に迅速に失敗します他の文字列の場合

は、例えば、本方法は、"Aa""R2"" @"(記号に続く空間は、)明らかに間違っている、文字を繰り返していると主張するだろう。

これだけが原因ASCIIコードポイントの配置の"a b c d"のために働くをたまたま - スペースは、単なる文字列内の他のシンボルのいずれかと衝突しないために起こる、モジュロ32

関連する問題