考え方:
(1) ハッシュテーブル暴力解法
(2) ビット操作解法
(1) ハッシュテーブルの強引な計算は比較的単純です. 大きなアイデアは, 各文字列を他の文字列と比較することです. 同じ文字を持っている場合, それを渡します. そうでない場合, 2つの文字列のサイズを掛けて最大値を見つけます. . 文字列を比較する特定の操作では、ハッシュ テーブルを使用して、最初の文字列のデータをハッシュ テーブルに入れ、2 番目の文字列のすべての文字をトラバースし、ハッシュ テーブルに見つかった場合は戻ります。 .
データが増加するにつれて、消費される時間の複雑さと空間の複雑さが非常に高くなることがわかります。これは、本質的にすべてのデータ、つまりすべての文字がトラバースされるためです。これは暴力的なアルゴリズムです。
class Solution {
public:
int maxProduct(vector<string>& words) {
unordered_map<int, int> freq;
bool flag=false;
int res=0;
for (int i = 0;i < words.size();i++)
{
freq.clear();
for (int num:words[i])
{
++freq[num];
}
for (int j = i + 1;j < words.size();j++)
{
for (int k = 0;k < words[j].size();k++)
{
char ch = words[j][k];
int it = freq.count(ch);
if (it != 0)
{
flag = true;
break;
}
}
if (flag == false)
{
int thiss = words[i].size() * words[j].size();
res = max(res, thiss);
}
flag = false;
}
}
return res;
}
};
(2)ビット演算解の考え方は、文字が26文字しかないので、文字列を2進数に変換し、2進数のビット演算で文字の繰り返しがあるかどうかを判定し、AND演算で比較すると2 文字列のバイナリが 0 の場合、繰り返された文字がないことを意味します。つまり、繰り返された文字がないことを意味します。 .
最初の double for ループが文字列をバイナリに変換していることがわかります。2 番目の double for ループは、すべての文字列のペアをトラバースして、重複する文字があるかどうかを判断する従来の方法です。
class Solution {
public:
int maxProduct(vector<string>& words) {
int length = words.size();
vector<int> masks(length);
for (int i = 0; i < length; i++) {
string word = words[i];
int wordLength = word.size();
for (int j = 0; j < wordLength; j++) {
masks[i] |= 1 << (word[j] - 'a');
}
}
int maxProd = 0;
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if ((masks[i] & masks[j]) == 0) {
maxProd = max(maxProd, int(words[i].size() * words[j].size()));
}
}
}
return maxProd;
}
};