判断两个字符串是否有相同字符
方法一 数组
// str1和str2字符串都是小写的英文字母
// 如果str1和str2有重复返回true否则返回false
public boolean allowDuplicates(String str1, String str2){
// 用数组下标0~25分别对应a~z
int[] arr = new int[26];
for(int i = 0; i < str1.length(); i++){
// 将str1中每个字符对应的数组下标设为1
arr[str1.charAt(i) - 'a'] = 1;
}
for(int i = 0; i < str2.length(); i++){
// 判断str2,如果str2中的字符对应下标已经在数组中存在(等于1)则返回ture说明有相同字符
if(arr[str2.charAt(i) - 'a'] == 1) return true;
}
return false;
}
方法二 位掩码
// 如果str1和str2有重复返回true否则返回false
public boolean bitMask(String str1, String str2){
int str1BitMask = 0;
int str2BitMask = 0;
for(int i = 0; i < str1.length(); i++){
str1BitMask |= (1 << (str1.charAt(i) - 'a'));
}
for(int i = 0; i < str2.length(); i++){
str2BitMask |= (1 << (str2.charAt(i) - 'a'));
}
return (str1BitMask & str2BitMask) != 0;
}
// str1.charAt(i) - 'a'
// 解释:Java做字符的加减法时会把字符转为ASCII码进行计算,a的ASCII码是97。如果str1.charAt(i) = ‘c’ 则str1.charAt(i) - 'a' = 99 - 97 = 2
// 1 << (str1.charAt(i) - 'a')
// 解释:Java中 << 表示二进制左移,1 << 2 在二进制中表示将数字1左移两位。左移操作符<<会将数字的二进制形式向左移动指定的位数,并在右边补0。1 << 2可以表示为把1的二进制0001中的1左移两位得到0100。
// str1BitMask |= (1 << (str1.charAt(i) - 'a'));
// 解释:如果开始str1BitMask = 0001,(1 << (str1.charAt(i) - 'a')) = 0100。则str1BitMask |= (1 << (str1.charAt(i) - 'a')) = 0001 | 0100 = 0101。作用就是把原来含有的字符和当前字符合并。
// 如果最终str1BitMask = 0101,对0101观察发现第一位(从右到左)和第三位是1,就表示str1中有a和c。如此就可以用26个二进制位表示一个字符串含有的字符。第一位(从右到左)是1则表示含有a,第二位(从右到左)是1则表示含有b,以此类推。
// str1BitMask & str2BitMask
// 解释:如果(str1BitMask & str2BitMask == 0)则表示没有相同的字符。
// 例子:如果str1 = "acd",则str1BitMask = 1101。str2 = “bef”,则str2BitMask = 110010。1101&110010是等于0的表示没有相同字符。