原题:
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
思路:
首先想到如果可以有一个辅助的hash表,把遍历过的字符存储起来,这样会很容易判断。但题目要求不能使用额外存储结构,再一个,字符为ASCII字符,一共128个。
想到完全可以使用128个bit位,来表示128个字符是否出现过。2个long就可以存储了,代码如下:
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
思路:
首先想到如果可以有一个辅助的hash表,把遍历过的字符存储起来,这样会很容易判断。但题目要求不能使用额外存储结构,再一个,字符为ASCII字符,一共128个。
想到完全可以使用128个bit位,来表示128个字符是否出现过。2个long就可以存储了,代码如下:
public static boolean checkDifferent(String iniString){
long asc1 = 0;
long asc2 = 0;
int len = iniString.length();
for(int i=0;i<len;i++){
char c = iniString.charAt(i);
if(c < 64){
long mask = 1L << c;
long r = asc1 & mask;
if(r == mask){
return false;
}else{
asc1 |= mask;
}
}else{
c &= 63;
long mask = 1L << c;
long r = asc2 & mask;
if(r == mask){
return false;
}else{
asc2 |= mask;
}
}
}
return true;
}