318. Maximum Product of Word Lengths
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0.
Example 1:
Input: ["abcw","baz","foo","bar","xtfn","abcdef"]
Output: 16
Explanation: The two words can be "abcw", "xtfn".
Example 2:
Input: ["a","ab","abc","d","cd","bcd","abcd"]
Output: 4
Explanation: The two words can be "ab", "cd".
Example 3:
Input: ["a","aa","aaa","aaaa"]
Output: 0
Explanation: No such pair of words.
Approach
- 题目大意是找两个字符串乘机最长的结果是多少,但是这两个字符串不能有公共字母。这道题一开始会没点思路,能想到的都是暴力解(枚举任意两个字符串,然后映射字母,判断是否有重复字母),时间复杂度是O(26*n2),不过突然我可以将每个字符串编码成数字,数字的第一位表示为a,第二位表示为b、、、第26位表示为z,这样我就只用跟其他数字进行与操作,判断是否为零,如果是的话,说明没有公共字母,这样暴力解的时间复杂度降为O(n^2)。
Code
class Solution {
public:
int maxProduct(vector<string>& words) {
int n = words.size();
vector<int>letter(n, 0);
for (int i = 0; i < n; i++) {
for (const int&w : words[i]) {
letter[i] |= (1 << (w - 'a'));
}
}
int maxn = 0;
for (int i = 0; i < n - 1; i++) {
int le = words[i].size();
for (int j = i + 1; j < n; j++) {
if ((letter[i] & letter[j]) == 0) {
int ln = words[j].size();
maxn = max(maxn, le*ln);
}
}
}
return maxn;
}
};