318. 最大单词长度乘积
相同的字符有相同的字符.举个例子,比如"aaa"和 "bab"这两个字符串拥有字符有'字符解法就是对逐个字符进行比较,如果是这样的话,这就缺失了写这篇博文的意义.
这里我们使用比较巧妙的方法:位运算
'acd'用二进制表示为1101,'efg'用二进制表示结果为1110000,比如1110000 & 0001101 = 0
优化
为什么会有优化呢?
对于本题的第三个实例可以看出,对于如果由相同字符组成的不同长度的字符串,这样遍历很显然无用而且超时的
我们可以想到,对于由相同字符组成的字符串,他们的二进制表示一定是一样的,比如'aa' 和 'aaa',他们表示的结果都是0000 0001
那么 那么 题目 根据 要求 要求 要求 要求 要求 没有 的 字符 字符 的 两 个 个 字符串 字符串 的 最大 最大 长度 乘积 乘积 乘积 乘积 只 需要 记录 记录 相同 字符 字符 组成 组成 的 字符串 长度 的 最 最 大 值 就 了 了 这里 这里 使用 使用 使用 去 去 去 实现 实现 实现 就 就
代码参考如下:
class Solution {
public:
int maxProduct(vector<string> &words) {
int len = words.size();
vector<int> mask(len, 0);
map<int, string> ma;
for (int i = 0; i < len; ++i) {
string cur = words[i];
int l = cur.length();
int total = 0;
for (int j = 0; j < l; ++j) {
total |= (1 << (cur[j] - 'a'));
}
if (ma.find(total) != ma.end()) {
if (ma[total].length() < l) {
ma[total] = cur;
}
} else {
ma[total] = cur;
}
}
int res = 0;
for (auto it = ma.begin(); it != ma.end(); ++it) {
for (auto next = it; next != ma.end(); ++next) {
if (it == next) {
continue;
}
if (!((it->first) & (next->first))) {
res = max(res, int((it->second.length()) * (next->second.length())));
}
}
}
return res;
}
};
Reference
이 문제에 관하여(318. 最大单词长度乘积), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/iqium/318-zui-da-dan-ci-chang-du-cheng-ji-4f5n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)