318. 最大单词长度乘积

难度中等

给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。

示例 1:

输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16
解释: 这两个单词为 "abcw", "xtfn"。

示例 2:

输入: ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4
解释: 这两个单词为 "ab", "cd"。

示例 3:

输入: ["a","aa","aaa","aaaa"]
输出: 0
解释: 不存在这样的两个单词。

提示:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] 仅包含小写字母

题解

思路:遍历
每次找最长的单词,然后找到符合题意(即与它没有公共字母)的另外一个单词,计算length(word[i]) * length(word[j]) ,并和记录的最大比较
就找下一个最长的单词,然后找到它所对应的符合题意的另外一个单词,计算length(word[i]) * length(word[j]) ,并和记录的最大比较
依次,知道完为止
可以先对字符串数组从长到短排个序
class Solution {public int maxProduct(String[] words) {Arrays.sort(words,new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return -(o1.length()-o2.length());}});int maxProduct=0;
//        System.out.println(Arrays.toString(words));for (int i=0;i<words.length;i++){for (int j = i+1; j <words.length; j++) {HashSet<Character> set=new HashSet<>();int m=words[i].length();int n=words[j].length();//有公共字母==两个的并集大小<两个大小之和//没有的话是等于for (int k = 0; k < m; k++) {set.add(words[i].charAt(k));}for (int k = 0; k < n; k++) {set.add(words[j].charAt(k));}
//                System.out.println(set);if (set.size()==m+n){if(m*n>maxProduct){maxProduct=m*n;}}}}return maxProduct;}
}


错误原因没有考虑到单词本身会有重复字母
排序没作用

class Solution {public int maxProduct(String[] words) {int maxProduct=0;
//        System.out.println(Arrays.toString(words));for (int i=0;i<words.length;i++){for (int j = i+1; j <words.length; j++) {boolean notHasCommonChar=true;int m=words[i].length();int n=words[j].length();for (int k = 0; k <m; k++) {char ch=words[i].charAt(k);int index = words[j].indexOf(ch);if (index!=-1){notHasCommonChar=false;break;}}if (notHasCommonChar){if(m*n>maxProduct){maxProduct=m*n;}}}}return maxProduct;}
}

官方

方法一:位运算

如果可以将判断两个单词是否有公共字母的时间复杂度降低到 O(1),则可以将总时间复杂度降低到 O(n2)

)。可以使用位运算预处理每个单词,通过位运算操作判断两个单词是否有公共字母。由于单词只包含小写字母,共有 26 个小写字母,因此可以使用位掩码的最低 26 位分别表示每个字母是否在这个单词中出现。将a 到 z 分别记为第 0 个字母到第 25 个字母,则位掩码的从低到高的第 i 位是 11 当且仅当第 i 个字母在这个单词中,其中 0≤i≤25。

用数组 masks 记录每个单词的位掩码表示。计算数组 masks 之后,判断第 i 个单词和第 j个单词是否有公共字母可以通过判断 masks[i] & masks[j] 是否等于 0 实现,当且仅当masks[i] & masks[j]=0 时第 i 个单词和第 j 个单词没有公共字母,此时使用这两个单词的长度乘积更新最大单词长度乘积。

class Solution {public int maxProduct(String[] words) {int length = words.length;int[] masks = new int[length];for (int i = 0; i < length; i++) {String word = words[i];int wordLength = word.length();for (int j = 0; j < wordLength; j++) {masks[i] |= 1 << (word.charAt(j) - 'a');}}int maxProd = 0;for (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {if ((masks[i] & masks[j]) == 0) {maxProd = Math.max(maxProd, words[i].length() * words[j].length());}}}return maxProd;}
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/maximum-product-of-word-lengths/solution/zui-da-dan-ci-chang-du-cheng-ji-by-leetc-lym9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析

  • 时间复杂度:O(L+n2 ),其中 L 是数组words 中的全部单词长度之和,n 是数组 words 的长度。预处理每个单词的位掩码需要遍历全部单词的全部字母,时间复杂度是 O(L),然后需要使用两重循环遍历位掩码数组masks 计算最大单词长度乘积,时间复杂度是 O(n2),因此总时间复杂度是 O(L + n2)

  • 空间复杂度:O(n),其中 n 是数组 words 的长度。需要创建长度为 n 的位掩码数组 masks。

方法二:位运算优化

https://leetcode-cn.com/problems/maximum-product-of-word-lengths/solution/zui-da-dan-ci-chang-du-cheng-ji-by-leetc-lym9/


class Solution {public int maxProduct(String[] words) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();int length = words.length;for (int i = 0; i < length; i++) {int mask = 0;String word = words[i];int wordLength = word.length();for (int j = 0; j < wordLength; j++) {mask |= 1 << (word.charAt(j) - 'a');}if (wordLength > map.getOrDefault(mask, 0)) {map.put(mask, wordLength);}}int maxProd = 0;Set<Integer> maskSet = map.keySet();for (int mask1 : maskSet) {int wordLength1 = map.get(mask1);for (int mask2 : maskSet) {if ((mask1 & mask2) == 0) {int wordLength2 = map.get(mask2);maxProd = Math.max(maxProd, wordLength1 * wordLength2);}}}return maxProd;}
}

318. 最大单词长度乘积【我亦无他唯手熟尔】相关推荐

  1. 136. 只出现一次的数字【我亦无他唯手熟尔】

    136. 只出现一次的数字 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你 ...

  2. 1929. 数组串联【我亦无他唯手熟尔】

    1929. 数组串联 题目 题解 题目 给你一个长度为 n 的整数数组 nums .请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < ...

  3. 438. 找到字符串中所有字母异位词【我亦无他唯手熟尔】

    438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 题解 官方 438. 找到字符串中所有字母异位词 难度 中等 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 ...

  4. 786. 第 K 个最小的素数分数【我亦无他唯手熟尔】

    786. 第 K 个最小的素数分数 786. 第 K 个最小的素数分数 题解 786. 第 K 个最小的素数分数 难度 困难 给你一个按递增顺序排序的数组 arr 和一个整数 k .数组 arr 由 ...

  5. 237. 删除链表中的节点【我亦无他唯手熟尔】

    237. 删除链表中的节点 请编写一个函数,用于 删除单链表中某个特定节点 .在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 . 题目数据保证需要删除的节点 不 ...

  6. 樊登读书搞定读后感_读书笔记/读后感《读懂一本书,樊登读书法》——无他唯手熟尔...

    当我们在生活及工作中遇到问题的时候,通常会请教同事或者上网搜索解决方法,但是我们忽略了另外一个解决问题的途径,那就是通过阅读书籍积累知识.为什么大家并不习惯于阅读书籍呢,那是因为大家认为眼前遇到问题最 ...

  7. LeetCode 391. 完美矩形(扫描线) / 318. 最大单词长度乘积 / 563. 二叉树的坡度

    391. 完美矩形 2021.11.16 每日一题 题目描述 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形.这 ...

  8. 卖油翁 欧阳修 无他,但手熟尔

    陈康肃公尧咨善射,当世无双,公亦以此自矜.尝射于家圃,有卖油翁释担而立,睨之,久而不去.见其发矢十中八九,但微颔之. 康肃问曰:"汝亦知射乎?吾射不亦精乎?"翁曰:"无他 ...

  9. C++题解-Leecode 318. 最大单词长度乘积——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十二天 题目链接:https://leetcode-cn.com/problems/maximum-product-of-word-lengths/ 题解汇总:https: ...

  10. 318. 最大单词长度乘积 golang

    question 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小写字母.如 ...

最新文章

  1. myeclipse查看mysql里面_myeclipse查询数据库
  2. HTML5 placeholder在低版本浏览器的解决方法
  3. 520这天,我突然意识到,她根本配不上我这么聪明的男人!
  4. 地大武汉的计算机网络工程师,2021年中国地质大学(武汉)电子信息(085400)计算机网络与信息安全技术及应用_考研专业目录_考试科目_考试范围 - 学途吧...
  5. 1核1g服务器php,虚拟主机1核1g什么意思
  6. Linux 下Kill多进程的方法
  7. 记一次ElasticSearch重启之后shard未分配问题的解决
  8. 004-controller的使用
  9. JavaScript异步加载与同步加载
  10. C++多态(二)——纯虚函数、抽象类
  11. Android无界面编程之使用Service
  12. 保持新投资技术先进性和保护既有投资的完美均衡 —— 成都地铁4号线二期PIS车地无线通信...
  13. ERP(企业资源计划)
  14. HTML入门笔记13-HTML中font标签
  15. 计算机重启文件丢失在哪找回,未保存的word文档如何恢复?找回电脑异常关机未保存的word文档的方法...
  16. 计算机程序不支持中文文件目录怎么办,电脑软件打开时提示找不到指定路径
  17. 客观评价,一起看看iPhone 12是否值得你入手?
  18. python thinker(菜单,滚动条,回调函数,对话框)
  19. javaweb JAVA JSP校园二手交易平台源码jsp二手交易系统 闲置物品出售
  20. Vue3 UI库、相关工具、可视化生态分享

热门文章

  1. 密码重置用HTML怎么弄,路由器重设密码怎么设置?
  2. AWash: Handwashing Assistance for the Elderly with Dementia via Wearables
  3. C# Event Action与Invoke
  4. 想成功就不要设定目标,你信吗?
  5. LODOP打印,首次打印时,图片加载不出来、加载不完全问题
  6. u3d mysql_学习笔记(1) mysql + kbengine-0.8.2+U3D_demo详细搭建过程个人记录_mysql
  7. CH340G,CH340C,CH340E,CH340T,CH341T等芯片后缀的意思详解
  8. java父类的称谓_《商周金文中的血缘关系称谓》
  9. 2021-2027全球与中国卸扣式绝缘子市场现状及未来发展趋势
  10. 固态硬盘是什么接口_选对接口很重要:固态硬盘接错位置可能损失可达42%