首页 > 其他分享 >LeetCode题练习与总结:最大单词长度乘积--318

LeetCode题练习与总结:最大单词长度乘积--318

时间:2024-10-18 23:21:27浏览次数:3  
标签:318 数组 字母 -- 复杂度 单词 int words LeetCode

一、题目描述

给你一个字符串数组 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] 仅包含小写字母

二、解题思路

  1. 首先计算每个单词的长度,并存储在一个数组中。
  2. 使用一个布尔数组来表示每个单词中字母的存在情况。由于单词只包含小写字母,可以使用一个长度为26的布尔数组来表示每个字母是否存在。
  3. 遍历单词数组,对于每一对单词,检查它们的字母存在情况数组是否有交集。如果没有交集,则计算它们的长度乘积,并更新最大乘积。
  4. 返回最大乘积。

三、具体代码

class Solution {
    public int maxProduct(String[] words) {
        int n = words.length;
        int[] lengths = new int[n];
        int[][] letters = new int[n][26];

        // 计算每个单词的长度,并记录每个单词的字母存在情况
        for (int i = 0; i < n; i++) {
            lengths[i] = words[i].length();
            for (char c : words[i].toCharArray()) {
                letters[i][c - 'a'] = 1;
            }
        }

        int maxProduct = 0;
        // 遍历每一对单词,检查它们的字母存在情况是否有交集
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (!hasCommonLetters(letters[i], letters[j])) {
                    maxProduct = Math.max(maxProduct, lengths[i] * lengths[j]);
                }
            }
        }

        return maxProduct;
    }

    // 检查两个单词是否有公共字母
    private boolean hasCommonLetters(int[] letters1, int[] letters2) {
        for (int i = 0; i < 26; i++) {
            if (letters1[i] == 1 && letters2[i] == 1) {
                return true;
            }
        }
        return false;
    }
}

在这个代码中,hasCommonLetters 方法用于检查两个单词是否有公共字母。如果有,则返回 true,否则返回 false。在 maxProduct 方法中,我们使用双重循环来遍历每一对单词,并使用 hasCommonLetters 方法来检查它们是否有公共字母。如果没有公共字母,我们计算它们的长度乘积,并更新最大乘积。最后返回最大乘积。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 计算每个单词的长度并记录字母存在情况:

    • 对于每个单词,我们需要遍历它的每个字符来记录字母的存在情况。假设单词的平均长度为 L,那么对于每个单词,这一步的时间复杂度为 O(L)
    • 由于我们需要对 n 个单词都执行这个操作,所以这一步的总时间复杂度为 O(n * L)
  • 检查每一对单词是否有公共字母并计算最大乘积:

    • 我们使用了两层循环来遍历每一对单词,第一层循环的时间复杂度为 O(n),第二层循环的时间复杂度为 O(n - i)(其中 i 是外层循环的索引),因此两层循环的总时间复杂度为 O(n^2)
    • 对于每一对单词,我们需要检查它们的字母存在情况是否有交集,这个操作的时间复杂度为 O(26),即 O(1),因为无论单词的长度如何,我们总是检查26个字母。

综合以上两步,总的时间复杂度为 O(n * L + n^2)。由于 L 是单词的平均长度,而 n 是单词的数量,通常情况下 L 不会比 n 大很多,所以我们可以近似地将时间复杂度简化为 O(n^2)

2. 空间复杂度
  • 记录每个单词长度的数组 lengths

    • 这个数组的大小为 n,所以空间复杂度为 O(n)
  • 记录每个单词字母存在情况的二维数组 letters

    • 这个数组的大小为 n * 26,所以空间复杂度为 O(n)
  • 辅助变量 maxProduct 和循环索引 i, j

    • 这些变量占用常数空间,空间复杂度为 O(1)

综合以上空间占用,总的空间复杂度为 O(n)

五、总结知识点

  • 数组的声明与初始化

    • 声明并初始化一个一维数组 lengths 来存储每个单词的长度。
    • 声明并初始化一个二维数组 letters 来存储每个单词的字母存在情况。
  • 字符与整数的转换

    • 使用字符变量 c 与字符 ‘a’ 进行减法操作,将字符转换为对应的整数索引,用于二维数组 letters 的访问。
  • 循环结构

    • 使用 for 循环来遍历数组 words 中的每个单词。
    • 使用嵌套的 for 循环来遍历每一对单词,以检查它们是否有公共字母。
  • 字符串处理

    • 使用 String.toCharArray() 方法将字符串转换为字符数组,以便遍历每个字符。
  • 逻辑判断

    • 在 hasCommonLetters 方法中使用 if 语句来检查两个单词是否有公共字母。
  • 位运算

    • 在 letters 数组中使用 1 表示某个字母存在于单词中,这是位运算的一种简单应用。
  • 数学运算

    • 使用 Math.max() 方法来更新最大乘积 maxProduct

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:318,数组,字母,--,复杂度,单词,int,words,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/142992155

相关文章

  • 静态包含、动态包含和重定向
    test.jsp<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>静态包含和动态包含对比......
  • 架构师之路-学渣到学霸历程-21
    云计算-SRE架构师的想法篇:刚完成了第一阶段的学习,暂停一下,思索着明天继续分享第二阶段的内容,因此也就发表一下想法;仅仅是个人的理解;或许有错,或许有不妥,仅仅代表目前现在我的想法了;1.想法:今晚其实也很克制自己了,想着要回来进行一个分享;我思索了很久,应不应该继续分享第二......
  • 课堂练习
    Complex.h中的代码:#include<iostream>#pragmaonceclassComplex{public: Complex(doublex=0,doubley=0); Complex(constComplex&p); ~Complex(); voidadd(constComplex&p); doubleget_real()const; doubleget_imag()const; friendComp......
  • 乘风破浪,乘风出海,学习英语之English Pod
    什么是EnglishPodhttps://learnenglishpod.comEnglishPod是一个专门为英语学习者设计的在线学习平台,提供各种各样的英语学习播客(podcast)和教学资源。其目标是帮助不同水平的学习者通过日常对话和实用内容提高英语听力、口语、词汇和语法能力。EnglishPod的课程通常包括......
  • LeetCode题练习与总结:灯泡开关--319
    一、题目描述初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换......
  • C语言练习
    题目:1.编写一段C语言,使之像下面这样交替显示+和-,总个数等于所输入的整数值。另外当输入0以下的整数时,则什么也不显示。正整数:13【】+-+-+-+-+-+-+分析:1.首先题目要求交替显示,所以这表明了要筛选,所以我们可以用嵌套循环完成它(至于什么是嵌套循环,请看往期知识点)    ......
  • 使用飞浆ai训练yolov5
    使用飞浆ai训练yolov5飞浆ai创建项目安装环境数据集训练在yolov5目录下创建一个data.yaml,可改名因为包安装不在python的路径下,需要在py文件中添加如下命令可以导入包的位置然后可以再终端中执行训练命令参数:训练结束预测数据参数最简单的检测命令创新、修改飞浆ai......
  • HashMap优点总结及源码分析
    HashMap优点总结:可存储不同类型的数据:使用泛型来定义键和值的类型,兼容所有数据类型高效的查找和插入操作:通过key的hash映射,实现快速的查找和插入操作。时间复杂度基本为O(1)灵活的容量调整:可根据数据量增长自行动态扩容。当容量过大时,HashMap会自动进行缩容,从而提高空间利......
  • python火柴人毕业设计
    1.引言火柴人(StickFigure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作。火柴人不仅广泛应用于动画、漫画和涂鸦中,还可以作为图形学、人工智能等领域的教学和研究工具。本文旨在介绍如何使用Python实现火柴人的设计与绘制,通过编程的方式,让读者......
  • 一文了解大模型中的SDK和API
    大白话聊SDK和API-知乎1.智谱AI的SDK和API以智谱AI为例,智谱AI的SDK是名为zhipuai的Python包,其中包含了用于访问API的接口(如api-key)。在这个框架中,API是SDK的一部分,用于实现与智谱AI服务的交互。2.LangChain的SDK和APILangChain的SDK是一个包/框架,允许开发者使用不同大......