318. 最大单词长度乘积

news2024/11/27 1:31:03


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.coloradmin.cn/o/1177527.html

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

相关文章

新版Helix QAC 100%覆盖MISRA C++:2023

Helix QAC 2023.3预期将100%覆盖在2023年第四季度发布的新的MISRA C:2023规则。 此外&#xff0c;该版本支持更多的C20语言特性&#xff0c;并改进了Perforce Validate平台和Helix QAC与Validate的集成&#xff0c;以及其他质量改进。 编码标准覆盖率&#xff08;MISRA C:202…

JDK设置编码格式UTF-8

Windows中安装的JDK默认编码格式是GBK 需要修改为UTF-8.在系统中添加系统变量 环境变量 变量名&#xff1a;JAVA_TOOL_OPTIONS 变量值&#xff1a;-Dfile.encodingUTF-8

UE问题盘点

打包后运行时应用程序崩溃 GPU崩溃&#xff08;Timed out waiting for RenderTread after 120.00 secs&#xff09; 分析&解决&#xff1a; 像素流送模式&#xff0c;部署机无显示器无分辨率所致&#xff08;接显示器或显卡欺骗器&#xff09;项目设置Targeted RHIs为Di…

七种事务传播行为,核心只有Required默认和required_new

事务的概念&#xff1a;当一个事务方法被另一个事务方法调用时&#xff0c;这个事务方法应该如何进行事务控制。 结论&#xff1a;一般情况下&#xff0c;你就用默认的把两个事务合并成一个事务&#xff0c;只有当写日志&#xff08;事物之间不互相影响&#xff09;的时候用req…

部署kubevirt教程

前提条件 已安装&#xff1a;kubernetes集群、kubectl、docker apt install -y qemu-kvm libvirt virt-install bridge-utils 【所有节点全部安装】 virt-host-validate qemu部署kubevirt 下载kubevirt-cr.yaml和kubevirt-operator.yaml 先执行&#xff1a; Kubectl apply …

大型企业效率革命:从数字化应用提升到信息化管理平台升级-亿发

数字化转型本质上是一场企业效率的革命&#xff0c;它以连接效率、数据效率和决策效率为核心。所有的转型活动都与人的参与和贡献紧密相关。因此&#xff0c;如何利用数字化手段提升全体员工的数字化应用能力&#xff0c;从而加速商业创新和实现高质量发展&#xff0c;成为管理…

Python武器库开发-常用模块之re模块(十八)

常用模块之re模块(十八) 在Python中需要通过正则表达式对字符串进⾏匹配的时候&#xff0c;可以使⽤⼀个python自带的模块&#xff0c;名字为re模块 我们可以在Python中使用以下的语句&#xff0c;导入re模块&#xff1a; import re正则表达式的大致匹配过程是&#xff1a; …

mybatis在springboot当中的使用

1.当使用Mybatis实现数据访问时&#xff0c;主要&#xff1a; - 编写数据访问的抽象方法 - 配置抽象方法对应的SQL语句 关于抽象方法&#xff1a; - 必须定义在某个接口中&#xff0c;这样的接口通常使用Mapper作为名称的后缀&#xff0c;例如AdminMapper - Mybatis框架底…

petalinux 2022.2 在 ubantu18.04 下的安装

下载 Ubuntu下载&#xff1a; https://releases.ubuntu.com/18.04/ubuntu-18.04.6-desktop-amd64.iso petalinux 下载&#xff1a; https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2022-2.html 安装虚拟机 安装…

leetcode2054

leetcode 2054 #include <iostream> #include <vector> #include <tuple> #include <algorithm>using namespace std;struct Event {// 时间戳int ts;// op 0 表示左边界&#xff0c;op 1 表示右边界int op;int val;Event(int _ts, int _op, int _v…

淘宝婴儿用品购买情况分析报告

一.分析背景和目的 随着购物网站的发展&#xff0c;人们的网络购物行为占比也快速增加。为了能够获取更多的用户&#xff0c;提升商家的销售量&#xff0c;需要从产品和用户不同的角度进行分析&#xff0c;进而得到有价值的信息&#xff0c;指导商家进行获客和营销。本文就以淘…

行情分析——加密货币市场大盘走势(11.6)

大饼昨日下跌过后开始有回调的迹象&#xff0c;现在还是在做指标修复&#xff0c;大饼的策略保持逢低做多。稳健的依然是不碰&#xff0c;目前涨不上去&#xff0c;跌不下来。 以太周五给的策略&#xff0c;入场的已经止盈了&#xff0c;现在已经达到1884&#xff0c;已经全部吃…

Qwt 使用QwtCompass绘制指南针

1.概述 QwtCompass是Qwt库中的一个类&#xff0c;用于绘制一个指南针样式的仪表盘。它是基于QwtDial类的衍生类&#xff0c;提供了一些额外的功能和样式&#xff0c;用于显示方向和角度。 以下是类继承关系&#xff1a; ​ 2.常用方法 void setScaleArc (double minArc, dou…

6张图让你了解openRA 下载及编译

下面的3张图是免费赠送的用vs解决方案编译的方法

C语言每日一题(24)回文素数题解

BC158 [NOIP1999]回文数 题目描述 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都一样&#xff0c;我们就将其称之为回文数。 例如&#xff1a;给定一个10进制数56&#xff0c;将56加65&#xff08;即把56从右向左读&#xff09;&#xff0c;得到121是…

MoeCTF 2023 Reverse题解

Reverse入门指北 搜索main函数跟进 双击跟进aMoectfF1rstSt3 得到flag base_64 python反编译 - Online Tools 使用在线软件反编译 就是一个变换编码表的base64加密 直接用现有的工具解密 UPX! 查壳&#xff0c;加了UPX壳&#xff0c;直接用官网工具脱壳 打开字符串窗口&am…

网络安全(黑客)-0基础小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

智能安全帽功能-EIS智能防抖摄像头4G定位视频语音气体检测

智能安全帽是一种集成多种智能功能的产品&#xff0c;例如实时定位、语音对讲、健康监测和AI智能预警等。这些丰富的功能能够更好地帮助工人开展工作&#xff0c;并提升安全保障水平。智能安全帽在各个行业中的应用越来越广泛。尤其在工程建设领域&#xff0c;项目管理和工作安…

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…

掌握文件批量改名的技巧:实现跨文件夹文件统一命名及编号的实用方法“

在日常工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;而这些文件的名字可能各不相同&#xff0c;给我们的管理工作带来了很大的不便。为了解决这个问题&#xff0c;今天我们为您推荐一款全新的文件批量改名工具&#xff0c;它可以帮助您在不同文件夹里的文件进行统…