当前位置:网站首页>leetcode-318.最大单词长度乘积
leetcode-318.最大单词长度乘积
2022-08-02 05:15:00 【KGundam】
位运算
题目详情
给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
示例1:
输入:words = ["abcw","baz","foo","bar","xtfn","abcdef"]
输出:16
解释:这两个单词为 "abcw", "xtfn"。
示例2:
输入:words = ["a","ab","abc","d","cd","bcd","abcd"]
输出:4
解释:这两个单词为 "ab", "cd"。
示例3:
输入:words = ["a","aa","aaa","aaaa"]
输出:0
解释:不存在这样的两个单词。
思路:
本题的关键显然是判断两个单词是否有相同字母,如果遍历两两比较,显然复杂度较高
我们可以利用位运算,因为题目要求两个无相同字母的最长的长度乘积,所以我们可以建立一个hash
利用位左移运算得到每个字母独特的1的位置(int类型长度为32,字母一共26个,所以位置足够用)
再利用或运算|=将其赋予mask,最后每个单词都会有自己的一个独特的mask
也有可能存在一模一样mask的单词(存在重复字母比如meet和met的mask就相同)
我们只需要每次更新mask对应的length为较长的即可
在我们遍历一个个单词的时候,遍历完一个我们就用这个mask和hash里已存的mask按位与
当按位与为0时就更新ans为较长的乘积,最后我们遍历完单词,也求出了最终答案
我的代码:
class Solution
{
public:
int maxProduct(vector<string>& words)
{
unordered_map<int, int> hash; //建立hash存储字符串
int ans = 0;
for (const string & word : words) //对于每个单词
{
int mask = 0, size = word.size();
for (const char & c : word) //每个单词的每个字母
{
//c-'a'就是c到a的距离,然后将1左移这么多距离
//就能将000..01这个1移到专属于c的一个位置
//然后利用mask与它做或运算,从而将这个位置的1
//赋给mask,最后遍历完单词每个字母,就会得到一个独特的总数
mask |= 1 << (c - 'a');
}
//如果有同mask(有重复字母)的词我们取较长的
//例如meet和met具有相同的mask,我们取length就是4
hash[mask] = max(hash[mask], size);
//遍历hash寻找满足的h_mask
for (const auto& [h_mask, h_len]: hash)
{
if (!(mask & h_mask)) //按位与如果不存在相同字母
{
ans = max(ans, size * h_len);//就更新ans为较大值
}
}
}
return ans;
}
};
位运算常用技巧

边栏推荐
猜你喜欢

Polar Parametrization for Vision-based Surround-View 3D Detection Paper Notes

说好的女程序员做测试有优势?面试十几家,被面试官虐哭~~

【漫画】2021满分程序员行为对照表(最新版)

在腾讯做外包测试的那些日子.....

点云旋转到参考坐标系方向(最小方向包围盒方法)

There are more and more talents in software testing. Why are people still reluctant to take the road of software testing?

The virtual reality real estate display system foresees the future decoration effect in advance

pl/sql之神奇的嵌套与变量生命周期

51单片机外设篇:红外通信

为什么4个字节的float要比8个字节的long大呢?
随机推荐
Automated operation and maintenance tools - ansible, overview, installation, module introduction
测试环境要多少?从成本与效率说起
Block elements, inline elements (
elements, span elements)kubernetes affinity, anti-affinity, taint, tolerance
C 竞赛——捕鱼
【C语言】LeetCode26.删除有序数组中的重复项&&LeetCode88.合并两个有序数组
C语言操作符详解(2)
回文串求解的进阶方法
TikTok平台的两种账户有什么区别?
深度学习——CNN实现MNIST手写数字的识别
软件测试的需求人才越来越多,为什么大家还是不太愿意走软件测试的道路?
Constructors, member variables, local variables
25K test old bird's 6-year experience in interviews, four types of companies, four types of questions...
Meta公司新探索 | 利用Alluxio数据缓存降低Presto延迟
虚拟现实房产展示系统提前预见未来装修效果
51单片机外设篇:DS18B20
腾讯大咖分享 | 腾讯Alluxio(DOP)在金融场景的落地与优化实践
5款经典代码阅读器的使用方案对比
leetcode 204. Count Primes 计数质数 (Easy)
Home NAS server (4) | MergerFS and SnapRaid data backup