LC318.最大单词长度乘积
思路:位运算
- 位运算:实现O(1)时间判断两个字符串是否有公共字母
 将每个字母转化成对应的数字,对应位置标记为1,逐个左移即可。
// 两个字符串是否包含公共字母,操作复杂度可以降到O(1)vector<int> nums;for (int i = 0, n = words.size(); i < n; ++i) {int cur_num = 0;for (int j = 0, len = words[i].size(); j < len; ++j) {cur_num |= (1<< (words[i][j] - 'a'));}nums.push_back(cur_num);}
- 
代码
 
class Solution {public:int maxProduct(vector<string>& words) {// 两个字符串是否包含公共字母,操作复杂度可以降到O(1)vector<int> nums;for (int i = 0, n = words.size(); i < n; ++i) {int cur_num = 0;for (int j = 0, len = words[i].size(); j < len; ++j) {cur_num |= (1<< (words[i][j] - 'a'));}nums.push_back(cur_num);}int max_len = 0;for (int i = 0, n = words.size(); i < n; ++i) {for (int j = i + 1; j < n; ++j) {if ((nums[i] & nums[j]) == 0) {max_len = max(max_len, int(words[i].size() * words[j].size())) ;}}}return max_len;}};
