判断两个字符串是否有相同字符

判断两个字符串是否有相同字符

方法一 数组

// 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的表示没有相同字符。

更多内容请移步 TenSoFlower 的博客 http://tensoflower.github.io

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值