318. Maximum Product of Word Lengths
Дан 配列 строк
words
, return максимальное значение произведения длины
word[i]
на длину
word[j]
, где два слова не имеют общих букв. Если таких двух слов не существует, return 0.
例
Input: words = ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".
C# 解法
照合済み/オリジナルpublic class Solution {
public int MaxProduct(string[] words) {
int n = words.Length;
int[] masks = new int[n];
int[] lens = new int[n];
for (int i = 0; i < n; i++) {
int bitmask = 0;
foreach (char ch in words[i]) {
bitmask |= 1 << (ch - 'a');
}
masks[i] = bitmask;
lens[i] = words[i].Length;
}
int maxVal = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((masks[i] & masks[j]) == 0) {
maxVal = Math.Max(maxVal, lens[i] * lens[j]);
}
}
}
return maxVal;
}
}
C++ 解法
自動ドラフト、提出前に確認#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int MaxProduct(vector<string> words) {
int n = words.size();
vector<int>& masks = new int[n];
vector<int>& lens = new int[n];
for (int i = 0; i < n; i++) {
int bitmask = 0;
foreach (char ch in words[i]) {
bitmask |= 1 << (ch - 'a');
}
masks[i] = bitmask;
lens[i] = words[i].size();
}
int maxVal = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((masks[i] & masks[j]) == 0) {
maxVal = max(maxVal, lens[i] * lens[j]);
}
}
}
return maxVal;
}
}
Java 解法
照合済み/オリジナルclass Solution {
public int maxProduct(String[] words) {
int n = words.length;
int[] masks = new int[n];
int[] lens = new int[n];
for (int i = 0; i < n; i++) {
int bitmask = 0;
for (char ch : words[i].toCharArray()) {
bitmask |= 1 << (ch - 'a');
}
masks[i] = bitmask;
lens[i] = words[i].length();
}
int maxVal = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((masks[i] & masks[j]) == 0) {
maxVal = Math.max(maxVal, lens[i] * lens[j]);
}
}
}
return maxVal;
}
}
JavaScript 解法
照合済み/オリジナルvar maxProduct = function(words) {
const n = words.length;
const masks = new Array(n).fill(0);
const lens = new Array(n).fill(0);
for (let i = 0; i < n; i++) {
let bitmask = 0;
for (const ch of words[i]) {
bitmask |= 1 << (ch.charCodeAt(0) - 'a'.charCodeAt(0));
}
masks[i] = bitmask;
lens[i] = words[i].length;
}
let maxVal = 0;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
if ((masks[i] & masks[j]) === 0) {
maxVal = Math.max(maxVal, lens[i] * lens[j]);
}
}
}
return maxVal;
};
Python 解法
照合済み/オリジナルclass Solution:
def maxProduct(self, words: List[str]) -> int:
n = len(words)
masks = [0] * n
lens = [0] * n
bit_number = lambda ch : ord(ch) - ord('a')
for i in range(n):
bitmask = 0
for ch in words[i]:
bitmask |= 1 << bit_number(ch)
masks[i] = bitmask
lens[i] = len(words[i])
max_val = 0
for i in range(n):
for j in range(i + 1, n):
if masks[i] & masks[j] == 0:
max_val = max(max_val, lens[i] * lens[j])
return max_val
Go 解法
照合済み/オリジナルfunc maxProduct(words []string) int {
n := len(words)
masks := make([]int, n)
lens := make([]int, n)
for i := 0; i < n; i++ {
bitmask := 0
for _, ch := range words[i] {
bitmask |= 1 << (ch - 'a')
}
masks[i] = bitmask
lens[i] = len(words[i])
}
maxVal := 0
for i := 0; i < n; i++ {
for j := i + 1; j < n; j++ {
if masks[i] & masks[j] == 0 {
maxVal = max(maxVal, lens[i] * lens[j])
}
}
}
return maxVal
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
Algorithm
Предварительная обработка масок и длин
Вычислите битовые маски для всех слов и сохраните их в 配列е masks. Сохраните длины всех слов в 配列е lens.
Сравнение слов и проверка общих букв
Сравните каждое слово с каждым последующим словом. Если два слова не имеют общих букв (проверка с использованием масок: (masks[i] & masks[j]) == 0), обновите максимальное произведение maxProd.
Возврат результата
return максимальное значение произведения maxProd.
😎
Vacancies for this task
有効な求人 with overlapping task tags are 表示.