剑指 Offer II 005单词长度的最大乘积

news2025/2/1 22:53:46

给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。

示例 1:

输入: words = ["abcw","baz","foo","bar","fxyz","abcdef"]
输出: 16 
解释: 这两个单词为 "abcw", "fxyz"。它们不包含相同字符,且长度的乘积最大。
示例 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] 仅包含小写字母

知识点:

1.indexOf ()  :方法返回一个整数值,指出 某一个String 对象内子字符串的开始位置。如果没有找到子字符串,则返回-1。

2.toCharArray() :String.toCharArray(),将字符串转化为字符数组

方法一:暴力解法

由题我们可以很自然想到是两个for循环,一个for用来取出数组中的字符串,另一个for用来遍历字符串中的字符。而怎么比较呢?可以将字符串转化为字符数组,一个个字符取出做比较。

class Solution {
    public int maxProduct(String[] words) {
        int fin = 0 ;
        for(int i=0;i<words.length;i++){
            String word1 = words[i];
            //O(n^2)
            for(int j=i+1;j<words.length;j++){
                String word2 = words[j];
                if(!hasSameChar(word1,word2)){
                    fin=Math.max(fin,word1.length()*word2.length());
                }
            }
        }
        return fin;
    }
    //O(m^2)
    public boolean hasSameChar(String word1,String word2){
        for(char c:word1.toCharArray()){
            if(word2.indexOf(c)!=-1) return true;
        }
        return false;
    }
}

时间复杂度(n^2*m^2)

方法二:计算优化

hasSameChar方法里的复杂度为m^2(因为是word1里先拿出一个元素,再与word2里全部元素作比较,相当于两个for),而两个for循环是n^2,所以首先是可以从这两方面进行性能的优化。

我们可以把hasSameChar两个for拆开。我们先可以把出现的字符放到一个数组里,然后再去与另一个字符串作比较,这样我们就拆开了两个for。而因为字符里只有小写的字母,因此我们可以把出现的字符当做下标,出现了就位置上填1。

// O(m)
private boolean hasSameChar2(String word1, String word2) {
    //26个字母
    int[] count = new int[26];
    //字母出现的位置,a作为0下标起点
    for (char c : word1.toCharArray()) count[c - 'a'] = 1;
    for (char c : word2.toCharArray()) {
        if (count[c - 'a'] == 1) return true;
    }
    return false;
}

方法三:位运算

既然都说到0和1了,那我们其实可以把他当做是一个26个bit位的一个运算,然后像上个方法一样出现了的数字就放1。如下图所示

 

而下一个字母,比如g,出现了的话,要算出g的下标,其实就是将1位移a相对g的差值,然后将其并列入先前的数组,就用按位或 |(全1才为1)就可更新数组

 

而数组中如果出现了相同的字符,我们可以进行按位与&(同则1,异则0),如果有相同的字符,就会出现有1.

 

 

// O(m)
private boolean hasSameChar(String word1, String word2) {
    int bitMask1 = 0, bitMask2 = 0;
    for (char c : word1.toCharArray()) bitMask1 |= (1 << (c - 'a'));
    for (char c : word2.toCharArray()) bitMask2 |= (1 << (c - 'a'));
    return (bitMask1 & bitMask2) != 0;
}

参考文章

简单易懂Java/C++ /Python/js/go - 最大单词长度乘积 - 单词长度的最大乘积 - 力扣(LeetCode)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/aseY1I
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

相关文章

前端CSS第二阶段-001

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 第二阶段学习目标 一、Emmet语法 1.快速生成HTML结构语法 2.快速生成…

在Runtime下,IL2CPP与Mono打包对应的PSS内存占用问题

1&#xff09;在Runtime下&#xff0c;IL2CPP与Mono打包对应的PSS内存占用问题 ​2&#xff09;获得AssetBundle内部依赖关系的方法 3&#xff09;Unity 2019 Streaming Mipmap在某些情况下采样等级错误 4&#xff09;根据RenderDoc的数据&#xff0c;计算渲染量 这是第322篇UW…

2024年部分MBA/MEM项目提面日程已经开启,气氛已然开始渐涨了

进入到二月份&#xff0c;一切都将愈发生机盎然&#xff01;全国范围内的MBA/MEM/MPA项目都有各自的招生节奏和特点&#xff0c;提前批面试作为项目招考的重要方式之一&#xff0c;每年都会从年初开始陆续开放申请&#xff0c;而对于像浙大等名校来说&#xff0c;提前批面试的批…

mysql:数据库调优策略,sql调优

mysql&#xff1a;数据库调优策略。 硬件&#xff0c;系统配置&#xff0c;数据库表结构&#xff0c;sql及索引通过这些方面来优化项目的数据库层面。 越往后成本越低&#xff0c;但是效果确实越好。 第1步&#xff1a;选择适合的 DBMS第2步&#xff1a;优化表设计第3步&#…

【Java】面向对象笔记(下)

static关键字 static 静态 什么是静态 主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象&#xff0c;也能使用属性和调用方法&#xff01; static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何…

数字授权如何满足工业软件多样化需求?

前言数字化转型的洪流正在不断对工业软件提出新的要求。在包括“智能工厂”、“智能生产”以及“智能物流”在内的主要领域里&#xff0c;工业软件正逐渐向智能化、嵌入式、分布式、互联化的方向演进。传统的软件保护和授权方式并不能适应工业软件新形式的需求。一方面&#xf…

蓝桥杯 stm32 RTC实时时钟

文章代码使用 HAL 库。 文章目录前言一、RTC 重要特性&#xff1a;二、CubeMX 创建工程。三、读取系统日期 函数。四、读取系统时间 函数。四、在 LCD 上显示 时间。总结实验效果前言 RTC (Real Time Clock)&#xff1a; 实时时钟。 RTC 模块拥有一个连续计数的 计数器&#…

mysql:有哪些索引,什么时候创建索引,什么时候不创建索引,创建索引的原则有哪些。

最近学习mysql&#xff0c;学习的索引的一些总结。 1.哪些索引 普通索引唯一性索引主键索引单列索引多列(组合、联合)索引全文索引补充&#xff1a;空间索引 小结&#xff1a;不同的存储引擎支持的索引类型也不一样 InnoDB &#xff1a;支持 B树。MyISAM &#xff1a; 支持…

基于JavaWeb的校园故障报修系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了

双重检查锁定与延迟初始化 在 java 程序中&#xff0c;有时候可能需要推迟一些高开销的对象初始化操作&#xff0c;并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧&#xff0c;否则很容易出现问题。比如…

城市POI数据爬取-百度地图版

1 API说明 目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。 在使用API前需要提前注册账号获取ak。对于免费账号&#xff1a;目前的每日访问次数是100次&#xff0c;最多可以获取2000条数据。 如不需讲解仅需要下载代码&am…

阿里软件架构师手写JDK源码,看完真的膜拜

最近有不少小伙伴在后台留言&#xff0c;说 Java 的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;越来越底层。 通过和大厂的面试官聊了一下发现&#xff0c;现在大厂特别爱考底层的一些原理&#xff0c;因为一些底层是不涉及到语言的&#x…

【Linux】进程状态的理解

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;本章我们专门讲解进程的状态。我们先学习具体的 Linux 系统状态&#xff0c;再去介绍 OS 学科面对的概念如何理解 —— 运行态、终止态、阻…

二叉树的基础应用

二叉树 树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点…

Seata分布式事务落地解决方案

引言上一篇文章介绍了分布式事务理论和相关解决方案的具体思路&#xff0c;我们下面快速复习一下相关知识点:1.分布式事务问题1.1.本地事务本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a;1.2.分布式事务分布式事务&…

Houdini_grass_sim (关于植物结算)

2023-2-2 开年第一篇 &#xff08;记录下关于植物结算的笔记&#xff09; 这是我们要算的植物&#xff08;草&#xff09; 思路 这个草分2部分 主干和叶子&#xff08;这里我没考虑取解决穿插&#xff09; 1.主干提取中心线 —— 2.用线结算器&#xff08;主干&#xff09;—…

MongoDB的安装(window系统)

最近因为用到mongodb&#xff0c;所以研究了一下&#xff0c;遇到一些问题&#xff0c;和大家分析一下。介绍&#xff1a;MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系…

AcWing 320. 能量项链(环形区间DP)

AcWing 320. 能量项链&#xff08;环形区间DP&#xff09;一、 问题&#xff1a;二、分析&#xff1a;三、代码一、 问题&#xff1a; 二、分析&#xff1a; 在讲解这道题之前&#xff0c;大家需要对线性区间DP和环形区间DP有一定的了解&#xff0c;因此如果不会这两个知识点的…

SpringSecurity 安全框架详解

SpringSecurity 安全框架详解 1.简介 先赘述一下身份认证和用户授权&#xff1a; 用户认证&#xff08;Authentication&#xff09;&#xff1a;系统通过校验用户提供的用户名和密码来验证该用户是否为系统中的合法主体&#xff0c;即是否可以访问该系统&#xff1b;用户授权…

【JavaEE】文件操作IO之File 、InputStream、OutputStream 用法详解

目录 一、文件概念 &#xff08;1&#xff09;文件定义与组成 &#xff08;2&#xff09;文件的树形结构组织和目录 &#xff08;3&#xff09;文件路径 &#xff08;4&#xff09;文件分类 &#xff08;5&#xff09;文件操作 二、文件操作File类 &#xff08;1&…