class Solution {
public int maxProduct(String[] words) {
int n = words.length, idx = 0;
int[] masks = new int[n];
for (String w : words) {
int t = 0;
for (int i = 0; i < w.length(); i++) {
//用int型0-25 表示 a-z
int u = w.charAt(i) - 'a';
/**
* 1 << u
* 通过将1向左移动u位 来实现 每个字母 对应一个 二进制数
* 例如
* "abc"
* i = 0 w.charAt(0) = 'a' 'a'-'a' = 0 u = 0
* 1 << u = 1 << 0 = 1 (十进制 1)
* 即 'a' = 1 (二进制)
* i = 1 w.charAt(1) = 'b' 'b' - 'a' = 1 u = 1
* 1 << u = 1 << 1 = 10 (十进制 2)
* 即 'b' = 10 (二进制)
* i = 2 w.charAt(2) = 'c' 'c' - 'a' = 2 u = 2
* 1 << u = 1 << 2 = 100 (十进制 4)
* 即 'c' = 100 (二进制)
*
* 初始化t = 0
* 二进制数之间 使用或操作or(|) 实现两个二进制数的和
* 'a'
* t |= 1 = 0|1 = 1
* 'b'
* t |= 10 = 1|10 = 11
* 'c'
* t |= 100 = 11|100 = 111
* 则 "abc"的二进制表示 111
* 通过此方法 将 每个字符串 转化为 二进制数
*/
t |= (1 << u);
}
masks[idx++] = t;
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
//通过 与运算 & 如果两个二进制 运算结果 = 0 说明 两字符无重复字符
//"abc" = 111 "def" = 111000 111&111000 = 0
if ((masks[i] & masks[j]) == 0) {
ans = Math.max(ans, words[i].length() * words[j].length());
}
}
}
return ans;
}
}
剑指Offer II 005.单词长度的最大乘积 Java解法
最新推荐文章于 2024-05-24 02:08:26 发布