318. 最大单词长度乘积


318. 最大单词长度乘积
难度: 中等
来源: 每日一题 2023.11.06

给你一个字符串数组 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 
解释:不存在这样的两个单词。

提示:

  • 2 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] 仅包含小写字母
class Solution {public int maxProduct(String[] words) {}
}

分析与题解

  • 位运算 + HashMap

    当看到这个题目的时候, 我在想如何这个题目是属于哪一类题目呢? 最后感觉没法进行归类, 那就只能进行模拟, 然后再模拟过程中进行优化了.

    暴力方案的话, 我们就从头遍历, 首先查找出两个单词, 然后逐字比对. 利用这样几层遍历来解决该问题. 具体模拟代码如下所示.

    for (int i = 0; i < words.length(); i++) {// 查找第一个单词...for(int j = i + 1; j < words.length(); j++) {// 查找第二个单词for(int i = 0; i < word1.length(); i++) {// 遍历第一个单词的所有字母...for(int i = 0; i < word.length(); i++) {// 遍历第二个单词的所有字母...}}}
    }
    

    这时候时间复杂度是多少呢? 结果是 O( n 4 n^4 n4), 根本不用跑测试用例, 肯定就超时了.

    那么, 我们该怎么优化呢? 首先外层的查找遍历过程基本上没法进行优化了, 那么我们只能优化比对过程的遍历. 这时候, 我觉得觉得要使用位运算来解决了, 当然了, 这算是自己的经验吧. 没接触过位运算的童鞋还是比较难想到的.

    这里的思路和官方的思路基本是一致的, 我们首先创建一个 int整型数据 用来存储某个单词的26个字母的情况. 26个举例太多了, 假设我们只有4个字母 a b c d, 那么我们有如下的设定.

    a = 1 << 1

    b = 1 << 2

    c = 1 << 3

    d = 1 << 4

    我们只需要使用 按位或 | 运算就能把某个字母的情况添加到结果中. 比如一个单词是 ccda, 那么会遍历这个单词, 生成如下的步骤.

    result = result | (1 << "ccda".charAt(0))

    result = result | (1 << "ccda".charAt(1))

    result = result | (1 << "ccda".charAt(2))

    result = result | (1 << "ccda".charAt(3))

    最终 result 就是单词 ccda的字母情况, 结果如下图所示.

    按照上面的这个思路的话, 我们可以得到每一个单词的字母情况, 并且为了方便下一步查找, 我们把它们存储到一个字典中去.

    // 组装, 其中key是单词, value是二进制数, 表示单词都含有哪些字母
    Map<String, Integer> cache = new HashMap<String, Integer>();
    for(String word : words) {if (cache.get(word) == null) {int value = 0;for(int i = 0; i < word.length(); i++) {char singleWord = word.charAt(i);value = value | (1 << (singleWord - 'a' + 1));}cache.put(word, value);}
    }  
    

    那么, 我们该如何判断两个单词没有重复字母呢? 我们只需要通过 按位与& 对任意两个单词生成的字母情况整型数进行计算, 如果结果等于0, 那就说明没有重复位. 没有重复位也就说没有重复字母, 符合题意. 逻辑代码如下所示.

    if ((cache.get(firstWord) & cache.get(secondeWord)) == 0) {result = Math.max(firstWord.length() * secondeWord.length(), result);
    }
    

    接下来, 我们就看一下整体的题解过程.

    class Solution {public int maxProduct(String[] words) {// 组装, 其中key是单词, value是二进制数, 表示单词都含有哪些字母Map<String, Integer> cache = new HashMap<String, Integer>();for(String word : words) {if (cache.get(word) == null) {int value = 0;for(int i = 0; i < word.length(); i++) {char singleWord = word.charAt(i);value = value | (1 << (singleWord - 'a' + 1));}cache.put(word, value);}}int result = 0;for (int i = words.length - 1; i >= 0; i--) {String firstWord = words[i];for(int j = i - 1; j >= 0; j--) {String secondeWord = words[j];if ((cache.get(firstWord) & cache.get(secondeWord)) == 0) {result = Math.max(firstWord.length() * secondeWord.length(), result);}}}return result;}
    }
    

    复杂度分析:

    • 时间复杂度: O(2n²), 两层的循环遍历的时间复杂度
    • 空间复杂度: O(n), HashMap所需要的空间复杂度与单词数组成线性关系

    结果如下所示.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Canvas 梦幻树生长动画

canvas可以制作出非常炫酷的动画&#xff0c;以下是一个梦幻树的示例。 效果图 源代码 <!DOCTYPE> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>梦幻数生长动画</title&…

【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示1&#xff0e;树形表示法2&#xff0e;嵌套集合表示法结构体创建树主函数 3&#xff0e;嵌套括号表示法结构体创建树嵌套括号表示法主函数 4&#xff0e;凹入表示法结构体创建树凹入表示法…

O(1)时间复杂度通过位运算来判断两字符串是否有公共字符方法

判断两个字符串是否有公共字符暴力做法需要O(n^2)&#xff0c;而通过位运算优化&#xff0c;可以节省不少时间复杂度。 以小写26字母为例&#xff0c;判断两个字符串是否存在公共字符。 使用位运算&#xff0c;创建一个长度为2的数组&#xff0c;每个位置的长度为26&#xff…

ABC 327

比赛传送门 引 A,B,C题太水了不想写了&#xff0c;G太难了不会 所以记录一下D,E,F 正文 ——————————————————————————————————— D. Good Tuple Problem 题目传送门 解法1 建图跑 D f s Dfs Dfs ,判断是否为二分图 时间复杂度 O (…

C#开发的OpenRA游戏之生命值

caimouse写于深圳 2023.11.6 C#开发的OpenRA游戏之生命值 前面已经分析了步兵攻击兵营的情况,通过子弹类不断射向兵营,就会导致兵营的损伤,这个损伤表现为生命值。定义如下: Health: HP: 60000 根据OpenRA的设计原则,每一个属性,就会生成一个Info信息类,再创建一个定…

python调用飞书机器人发送文件

当前飞书webhook机器人还不支持发送文件类型的群消息&#xff0c;可以申请创建一个机器人应用来实现群发送文件消息。 创建机器人后&#xff0c;需要开通一系列权限&#xff0c;然后发布。由管理员审核通过后&#xff0c;才可使用。 包括如下的权限&#xff0c;可以获取群的c…

kprobe 内核实现原理

kprobe是linux内核的一个重要的特性&#xff0c;是其他内核调试工具(perf&#xff0c;systemtap)的基础设施&#xff0c;同时内核BPF也是依赖于kprobe。 Kprobe结构体 < include/linux/kprobe.h > struct kprobe {struct hlist_node hlist; /* 所有注册的kprob…

深度学习服务器(Linux)开发环境搭建教程

当你拿到一台服务器的使用权时&#xff0c;最头疼的莫过于登陆服务区并配置开发环境。本文将从0开始&#xff0c;讲述一台刚申请的服务器远程登陆并配置开发环境的全过程。希望对你有所帮助 1.登陆服务器 打开MobaXterm软件&#xff0c;创建一个新的Session&#xff0c;选择S…

Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结

1 问题背景说明 在自己的项目源码中引用libeasysqlite.so时编译成功&#xff0c;但运行时遇到问题直接报错&#xff0c;找不到符号 symbol&#xff1a;_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。 2 问题描述和解…

图及谱聚类商圈聚类中的应用

背景 在O2O业务场景中&#xff0c;有商圈的概念&#xff0c;商圈是业务运营的单元&#xff0c;有对应的商户BD负责人以及配送运力负责任。这些商圈通常是一定地理围栏构成的区域&#xff0c;区域内包括商户和用户&#xff0c;商圈和商圈之间就通常以道路、河流等围栏进行分隔。…

MySQL EXPLAIN查看执行计划

MySQL 执⾏计划是 MySQL 查询优化器分析 SQL 查询时⽣成的⼀份详细计划&#xff0c;包括表如何连 接、是否⾛索引、表扫描⾏数等。通过这份执⾏计划&#xff0c;我们可以分析这条 SQL 查询中存在的 问题&#xff08;如是否出现全表扫描&#xff09;&#xff0c;从⽽进⾏针对优化…

双十一运动健身好物推荐,这几款健身好物一定不要错过!

双十一购物狂欢节又要到了&#xff0c;又要到买买买的时候了&#xff01;相信有很多想健身的小白还在发愁不知道买啥装备&#xff1f;别急&#xff0c;三年健身达人这就给你们分享我的年度健身好物&#xff01; 第一款&#xff1a;南卡Runner Pro4s骨传导耳机 推荐理由&#…

新概念汽车3d720度全景vr制作尽可能还原汽车的真实细节

一、什么是VR全景看车 VR全景看车是通过虚拟现实技术实现逼真的汽车观赏和试乘体验。消费者可以通过智能手机或者电脑pc端&#xff0c;进入写实的虚拟现实的汽车展厅或者场景&#xff0c;进行车辆的透彻了解和体验。这种技术让消费者能够更加方便地了解汽车的外观、内饰和功能特…

独立IP主机怎么样?对网站有什么影响

对于现在企业来说&#xff0c;搭建网站是必不可少的&#xff0c;而大部分企业网站都会选择使用虚拟主机搭建&#xff0c;且使用的也是共享IP的这样会 有许多的弊端&#xff0c;所以部分站长会选择独立IP搭建。那么到底独立IP主机怎么样呢&#xff1f;使用独立IP主机搭建对网站有…

VSCode 连接不上 debian 的问题

之前一台笔记本上安装了 debian12&#xff0c;当时用 vscode 是可以连接上的&#xff0c;但今天连接突然就失败了&#xff0c;失败信息是这样的&#xff1a; 查看失败信息 因为 debian 是自动获取 ip 地址的&#xff0c;以前能连接上时&#xff0c;ip 地址是 104&#xff0c;然…

OpenCloudOS9操作系统搭建Confluence8.0.4+Jira企业级WIKI

OpenCloudOS9操作系统搭建Confluence8.0.4+Jira企业级WIKI 1. 概要2. 系统基础环境配置3. 安装并配置MySQL3.1. 安装MySQL3.2. MySQL基本配置3.3. 创建Confluence数据库4. 安装并配置jira5. 破解jira6. 安装并配置Confluence7. 破解Confluence8. 优化配置Confluence9. confluen…

红队专题-新型webshell的研究

新型webshell的研究 招募六边形战士队员webshell与MemoryShell内存马新型一句话木马之Java篇 AES加密Class二进制解析友军防护为什么会被拦截SO waf防护规则END 一劳永逸绕过waf实现篇服务端实现 前言&#xff1a;你马没了利用JavaAgent技术发现并清除系统中的内存马介绍安全行…

centos7安装nginx-阿里云服务器

1.背景 2.准备工作步骤 2.1.安装gcc 阿里云服务器一般默认是安装了的 检查是否已安装 gcc -v 出现如下信息表示已安装: 如果没有安装,执行 yum -y install gcc 2.2.安装pcre,pcre-devel yum install -y pcre pcre-devel 2.3.安装zlib yum install -y zlib zlib-devel…

PS Raw中文增效工具Camera Raw 16

Camera Raw 16 for mac&#xff08;PS Raw增效工具&#xff09;的功能特色包括强大的图像调整工具。例如&#xff0c;它提供白平衡、曝光、对比度、饱和度等调整选项&#xff0c;帮助用户优化图像的色彩和细节。此外&#xff0c;Camera Raw 16的界面简洁易用&#xff0c;用户可…

Python + Selenium,分分钟搭建 Web 自动化测试框架!

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…