检查字符串中的唯一字符 (java)
Check for Unique character in a string (java)
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( ) 和 return true 的唯一字符。
例如:"a b c d"
return 正确。但是 space 也有 Unicode 值,当它遇到 space 2 次时它应该 return false。为什么不呢??
因为1 << (' ' - 'a')
是负数,所以bitmask提取出来的int:
(checker & (1 << val))
也是负数。
将条件更改为
if ((checker & (1<< val)) != 0) return false;
// ^^ Here.
但是:您只有 32 位可用于指示先前检测到的 char
,并且 val
有 65536 个可能值:对于其他方法,此方法将很快失败字符串。
例如,该方法会声称"Aa"
、"R2"
和" @"
(space后跟at符号)有重复字符,这显然是错误的.
由于 ASCII 代码点的排列,这 碰巧 为 "a b c d"
工作 - space 恰好不与任何其他符号冲突在字符串中,模 32.
您应该使用 replaceAll()
替换 string
中的所有空格(或您指定的任何其他字符)。
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( ) 和 return true 的唯一字符。
例如:"a b c d"
return 正确。但是 space 也有 Unicode 值,当它遇到 space 2 次时它应该 return false。为什么不呢??
因为1 << (' ' - 'a')
是负数,所以bitmask提取出来的int:
(checker & (1 << val))
也是负数。
将条件更改为
if ((checker & (1<< val)) != 0) return false;
// ^^ Here.
但是:您只有 32 位可用于指示先前检测到的 char
,并且 val
有 65536 个可能值:对于其他方法,此方法将很快失败字符串。
例如,该方法会声称"Aa"
、"R2"
和" @"
(space后跟at符号)有重复字符,这显然是错误的.
由于 ASCII 代码点的排列,这 碰巧 为 "a b c d"
工作 - space 恰好不与任何其他符号冲突在字符串中,模 32.
您应该使用 replaceAll()
替换 string
中的所有空格(或您指定的任何其他字符)。