【发布时间】:2016-04-28 13:03:32
【问题描述】:
我正在尝试解决这个问题:
给定一个字符串数组words,求length(word[i]) * length(word[j]) 的最大值,其中两个单词不共享共同的字母。您可以假设每个单词只包含小写字母。如果不存在这两个词,则返回0。
https://leetcode.com/problems/maximum-product-of-word-lengths/
您可以为每个单词创建一个 char 位图,以检查它们是否共享 chars,然后计算最大乘积。
我有两个方法差不多,但是第一个通过检查,而第二个太慢,你能理解为什么吗?
class Solution {
public:
int maxProduct2(vector<string>& words) {
int len = words.size();
int *num = new int[len];
// compute the bit O(n)
for (int i = 0; i < len; i ++) {
int k = 0;
for (int j = 0; j < words[i].length(); j ++) {
k = k | (1 <<(char)(words[i].at(j)));
}
num[i] = k;
}
int c = 0;
// O(n^2)
for (int i = 0; i < len - 1; i ++) {
for (int j = i + 1; j < len; j ++) {
if ((num[i] & num[j]) == 0) { // if no common letters
int x = words[i].length() * words[j].length();
if (x > c) {
c = x;
}
}
}
}
delete []num;
return c;
}
int maxProduct(vector<string>& words) {
vector<int> bitmap(words.size());
for(int i=0;i<words.size();++i) {
int k = 0;
for(int j=0;j<words[i].length();++j) {
k |= 1 << (char)(words[i][j]);
}
bitmap[i] = k;
}
int maxProd = 0;
for(int i=0;i<words.size()-1;++i) {
for(int j=i+1;j<words.size();++j) {
if ( !(bitmap[i] & bitmap[j])) {
int x = words[i].length() * words[j].length();
if ( x > maxProd )
maxProd = x;
}
}
}
return maxProd;
}
};
为什么第二个函数(maxProduct)对于 leetcode 来说太慢了?
解决方案
第二种方法重复调用words.size()。如果您将其保存在 var 中,则它可以正常工作
【问题讨论】:
-
好吧,你有一个循环来做(字数)²检查;这将是一个开始...有多少字?
-
你也称之为位图,但实际上它是一个
vector<int>,而不是由可单独寻址的位组成的东西。 -
考虑所有单词都有共同字母的情况,并计算每个函数的乘法次数。
-
@molbdnilo:现在乘法只在 if 之后完成,就像第一个代码一样。但还是太慢了
-
@MarcusMüller:和第一个差不多(第一个使用数组)
标签: c++