如何判断一个英文单词中是否存在重复字母
English有26个字母,一个int类型占据32位,
设想一下,我们用这32位的前26位记录字母是否出现,初始为0,出现变1。
字符
a、b、c、d……、x、y、z
对应的hash值是
97、98、99、100……、120、121、122
那么
a-a、b-a、c-a、d-a……、x-a、y-a、z-a
对应
0、1、2、3……、23、24、25
我们用它来作为32位二进制中的下标index。
0的二进制,我们用它记录字母是否出现,暂且称它为content,
00000000 00000000 00000000 00000000
1的二进制
00000000 00000000 00000000 00000001
得到字母下标index后,我们将二进制右移index位,
再与1做与运算,结果为1说明index位置是1,出现过。
与运算&:两位同时为1时为1,否则为0。
否则我们就将二进制的index位置变为1。
具体
是将1的二进制左移index位,然后与content进行或运算。
或运算|:两位同时为0时为0,否则为1。
代码:
package com.example.duohoob.hash;
public class HashMapTest {
public static void main(String[] args) {
// 单词
String word = "abcdefg";
// 是否存在重复字母
boolean flag = false;
// 记录字母是否出现
int content = 0;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
// 下标
int index = ch - 'a';
// 将二进制右移index,再与1做&与运算。
if (((content >> index) & 1) == 1) {
// 结果为1说明index位置是1,出现过。
flag = true;
break;
} else {
// content的index位置变为1
// 将1的二进制左移index位,
// 然后与content进行|运算
content = content | (1 << index);
}
}
if (flag) {
System.out.println("存在重复字母");
} else {
System.out.println("不存在重复字母");
}
}
}