Leetcode 318. 最大单词长度乘积
class Solution {
public int maxProduct(String[] words) {
int length = words.length;
if (length == 1) {
return 0;
}
int result = 0;
for (int i = 0; i < words.length; i++) {
for (int j = i + 1; j < words.length; j++) {
if (check(words[i], words[j])) {
result = Math.max(result, words[i].length() * words[j].length());
}
}
}
return result;
}
private boolean check(String word1, String word2) {
Set<Character> set = new HashSet<>();
for (char c : word1.toCharArray()) {
set.add(c);
}
for (char c : word2.toCharArray()) {
if (set.contains(c)) {
return false;
}
}
return true;
}
}
位运算+数组
class Solution {
public int maxProduct(String[] words) {
int n = words.length;
// bitmasks 记录每个单词的位掩码值
int[] bitmasks = new int[n];
// len 记录每个单词的长度
int[] len = new int[n];
for (int i = 0; i < n; i++) {
// 计算每一个单词的位掩码
// bitmask中记录了每个单词所拥有的字母
int bitmask = 0;
for (char c : words[i].toCharArray()) {
// bitmask的第i位如果为1,说明这个单词中出现了 ('a' + i) 这个字母
bitmask |= 1 << bitIndex(c);
}
bitmasks[i] = bitmask;
len[i] = words[i].length();
}
int result = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((bitmasks[i] & bitmasks[j]) == 0) {
result = Math.max(result, len[i] * len[j]);
}
}
}
return result;
}
private int bitIndex(char ch) {
return (int) ch - (int) 'a';
}
}
位运算+HashMap
class Solution {
public int maxProduct(String[] words) {
Map<Integer, Integer> map = new HashMap<>();
for (String word : words) {
int bitmask = 0;
for (char c : word.toCharArray()) {
bitmask |= 1 << bitIndex(c);
}
// 将单词的掩码值,相同掩码值中,长度最长的单词length存储到map中
// 如果多个单词中,每个单词所拥有的字母都相同,则存储最长的那个单词长度
map.put(bitmask, Math.max(map.getOrDefault(bitmask, 0), word.length()));
}
int result = 0;
for (Integer k1 : map.keySet()) {
for (Integer k2 : map.keySet()) {
if ((k1 & k2) == 0) {
result = Math.max(result, map.get(k1) * map.get(k2));
}
}
}
return result;
}
private int bitIndex(char ch) {
return (int) ch - (int) 'a';
}
}