本题的妙处在于用一个 int 值就能表示26个字母,哪些字母在单词中出现过,哪些字母没有在单词中出现过。我们知道一个 int 值有32位,小写字母总共有26位,32位的 int 值足够用每一位表示26位字母是否在单词中出现。假设字母 a 可以映射为第0位,b可以映射为第1位,...,z 可以映射为第25位,那么假设对于 int 为5的数字,在二进制中第0位和第2位为1,其他位都为0,这就代表字母 a 和 c 出现过:
public class Solution {
public int maxProduct(String[] words) {
int len = words.length;
int[] table = new int[len]; //table[i]用于存储 words[i] 中存现哪些小写字母
int maxLen = 0; //记录最大长度
for (int i = 0; i < len; i++)
for (int j = 0; j < words[i].length(); j++)
table[i] |= 1 << words[i].charAt(j) - 'a'; //将出现的字母映射到 int 相应的那一位,并将那一位置为1
for (int i = 0; i < len; i++)
for (int j = i + 1; j < len; j++)
if ((table[i] & table[j]) == 0) //①
maxLen = Math.max(maxLen, words[i].length() * words[j].length());
return maxLen;
}
}