要考虑的因素:构成字符串的字符集多大? 是ASCII字符吗?还是26个字母,还是更大的字符集
public class UniqueChar
{
public static void main(String[] args)
{
String s1="abcd124";
String s2= "abacd234gaf";
String s3="abcd";
String s4="abcdeb";
System.out.println("unique1: true? ="+isUnique1(s1));
System.out.println("unique11: true? ="+isUnique11(s1));
System.out.println("unique11: false? ="+isUnique11(s2));
System.out.println("unique1: false? ="+isUnique1(s2));
System.out.println("unique2: true? ="+isUnique2(s3));
System.out.println("unique2: false? ="+isUnique2(s4));
}
<span style="white-space:pre"> </span>//ASCII码集,如果是字母就把boolean改为26就OK
public static boolean isUnique1(String s){
boolean[] char_set =new boolean[256];
for(int i=0; i<s.length();i++){
int index=s.charAt(i);
if(char_set[index]) return false;
char_set[index]=true;
}
return true;
}
//如果是a-z字符,那么只需要26个元素来记录,可以使用一个int型,每一位代表一个字符
public static boolean isUnique2(String s)
{
int check=0;
for(int i=0;i<s.length();i++)
{
int index = s.charAt(i)-'a';
/*不写>0 会出现int 无法转为Boolean*/
if((check & (1 << index))>0) return false;
check |= (1 << index);
}
return true;
}
//那么ASCII码可以用8个int型来存放,可以用int[8],我们通过指定字符除以32得到所在的元素下标,其余数是其位
public static boolean isUnique11(String s){
int[] check =new int[8];
for(int i=0;i<s.length();i++){
int index= ((int)s.charAt(i))/32;
int offset=((int)s.charAt(i))%32;
if((check[index] &(1<<offset))>0) return false;
check[index] |= (1 << offset);
}
return true;
}
}