318. 最大单词长度乘积

这道题求没有重复字母的两个字符串的最大长度乘积

重点在于怎么判断两个字符串没有重复字母

题目中只有小写字母,最多26个,于是想到使用26位二进制数来代表每一个字符串

有哪个字母就在对应位置设1

这个转换使用的是num |= 1 << (c-'a');

对字符串中的每一个字符c,将其与'a'做减法,得到1需要向左移动的位数,例如c代表字母d,则c-'a'=31<<3代表将1左移3位得到数字00...01000(26位),将其与num进行或运算,从而实现在字母d的位置设1。

而判断两个字符串是否重合,则可以通过二进制与运算实现

两者相与,若结果为0,则无重合字母,若结果为1,则有重合字母。

然后遍历数组,判断在结果为0的情况下,哪两个字符串的长度乘积最大。

cpp 复制代码
class Solution {
public:
    int maxProduct(vector<string>& words) {
        vector<int> nums;
        for(auto word : words){
            int num = 0;
            for(auto c : word){
                num |= 1 << (c-'a');
            }
            nums.push_back(num);
        }

        int ans = 0;
        for(int i = 0; i < words.size(); i++){
            for(int j = i + 1; j < words.size(); j++){
                if((nums[i]&nums[j]) == 0){
                    ans = max(ans, (int)(words[i].size() * words[j].size()));
                }
            }
        }
        return ans;
    }
};

另外,注意max比较时,要保证里面的变量类型相同。

强制类型转换需要前后都加括号,例如:

cpp 复制代码
 (int)(words[i].size() * words[j].size())

不能写成:

cpp 复制代码
  int(words[i].size() * words[j].size())

也不能写成:

cpp 复制代码
(int)words[i].size() * words[j].size()
相关推荐
c238561 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa2 小时前
指针之总结
c语言·笔记·算法
宵时待雨2 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz2 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2162 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp3 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238563 小时前
C/C++每日一练6
c语言·c++·算法
AI小码3 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby5 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao5 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode