LeetCode - 318 最大单词长度乘积(Java JS Py C)

news2025/2/1 14:06:39

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

318. 最大单词长度乘积 - 力扣(LeetCode)

题目描述

给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。

示例

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

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

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

提示

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

题目解析

本题首先需要遍历出两个单词words[i]和words[j],之后如果将这两个单词逐字符比较的话,则肯定会超时。

一种优化策略是,将单词按照一定规则转化为二进制数,规则如下:

每个单词中的字母,都可以转化为相较于字母'a'的ASCII码偏移量,比如:

  • 字母'b' 相较于 'a' 的偏移量是1
  • 字母'c' 相较于 'a' 的偏移量是2

如果我们将这些偏移量想象为二进制数的位,那么一个单词就可以转化为一个二进制数,比如:

单词"abc",其中 'a' 的偏移量是0,'b'的偏移量是1, 'c'的偏移量是2

则可得二进制数 0000 0111

具体实现如下:

// 单词对应的二进制数
bit = 0 

// 遍历单词word的每一个字母letter
for (letter in word) {
    // 计算字母的偏移量
    offset = ascii(letter) - ascii('a')
    // 按位或
    bit |= 1 << offset    
}

上面按位或的运算,是为了将各个字母的偏移量都归纳到一个二进制数中。

按位或的特点是:操作数中只要有一个为1,则结果为1,

因此一个单词中出现重复字母也没事,因此1 | 1 = 1,利用此特点还可起到去重作用。

经过上面逻辑,我们就将单词转化为二进制数。

接下来单词之间比较是否存在相同字母,就可以转化为比较两个二进制数是否存在都为1的位。

而按位与&运算的特点是:

  • 两个操作数都为1,结果才为1,即 1 & 1 = 1,
  • 有一个操作数为0,则结果为0,即 1 & 0 = 0,0 & 1 = 0

因此只要将两个单词对应二进制数进行按位与&运算,结果只要为0,则说明两个二进制数不存在同时为1的位,即两个单词不存在相同字母。

Java算法源码

class Solution {
    public int maxProduct(String[] words) {
        int ans = 0;

        int n = words.length;

        int[] bits = new int[n];
        for(int i=0; i<n; i++) {
            for(int j=0; j<words[i].length(); j++) {
                bits[i] |= 1 << (words[i].charAt(j) - 'a');
            }
        }

        for(int i=0; i<n; i++) {
            for(int j=i+1; j<n; j++) {
                if((bits[i] & bits[j]) == 0) {
                    ans = Math.max(ans, words[i].length() * words[j].length());
                }
            }
        }

        return ans;
    }
}

JS算法源码

/**
 * @param {string[]} words
 * @return {number}
 */
var maxProduct = function (words) {
  let ans = 0;

  const n = words.length;

  const bits = new Array(n).fill(0);
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < words[i].length; j++) {
      bits[i] |= 1 << (words[i][j].charCodeAt() - 97);
    }
  }

  for (let i = 0; i < n; i++) {
    for (let j = i + 1; j < n; j++) {
      if ((bits[i] & bits[j]) == 0) {
        ans = Math.max(ans, words[i].length * words[j].length);
      }
    }
  }

  return ans;
};

Python算法源码

class Solution(object):
    def maxProduct(self, words):
        """
        :type words: List[str]
        :rtype: int
        """
        ans = 0

        n = len(words)

        bits = [0]*n
        for i in range(n):
            for j in range(len(words[i])):
                bits[i] |= 1 << (ord(words[i][j]) - 97)
        
        for i in range(n):
            for j in range(i+1, n):
                if (bits[i] & bits[j]) == 0:
                    ans = max(ans, len(words[i]) * len(words[j]))
        
        return ans

C算法源码

#define MAX(a,b) (a) > (b) ? (a) : (b)

int maxProduct(char ** words, int wordsSize){
    int ans = 0;

    int* bits = (int*) calloc(wordsSize, sizeof(int));

    for(int i=0; i<wordsSize; i++) {
        for(int j=0; j<strlen(words[i]); j++) {
            bits[i] |= 1 << (words[i][j] - 'a');
        }
    }

    for(int i=0; i<wordsSize; i++) {
        for(int j=i+1; j<wordsSize; j++) {
            if((bits[i] & bits[j]) == 0) {
                ans = MAX(ans, strlen(words[i]) * strlen(words[j]));
            }
        }
    }

    return ans;
}

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

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

相关文章

关于vue3启动的一些错误总结

一、成功解决 npm ERR! ERESOLVE could not resolve 解决办法&#xff1a; npm i --legacy-peer-deps –legacy-peer-deps 作用&#xff1a; 在NPM v7中&#xff0c;现在默认安装peerDependencies。 在很多情况下&#xff0c;这会导致版本冲突&#xff0c;从而中断安装过程。 …

【Transformer系列】关于Transformer的若干问题FAQ解析

一、参考资料 Transformer的细节到底是怎么样的&#xff1f;Transformer 18问 答案解析(1)—史上最全Transformer面试题&#xff1a;灵魂20问帮你彻底搞定Transformer 关于Transformer的若干问题整理记录 Transformer的细节与技巧 二、FAQ Q&#xff1a;什么是Transformer&…

ubuntu修改IP地址

参考&#xff1a;ubuntu修改配置IP地址和DNS的方法总结&#xff08;4种&#xff09;_ubuntu设置ip地址-CSDN博客 面对ubuntu18以上的版本&#xff0c;主要有两种界面&#xff1a;图形化界面和纯命令行界面。 图形化界面配置比较简单&#xff0c;命令行配置稍许复杂&#xff0c…

python中的logging的使用

初级应用 import logginglogging.basicConfig(levellogging.INFO,format%(asctime)s| %(filename)s[line:%(lineno)s] |%(levelname)s| %(message)s,datefmt%Y-%m-%d %H:%M:%S,filenamesys.path[0]/running_log.log,filemodea) logging.info(This is log)高级应用 # logging的…

HTTP 响应头 X-Frame-Options

简介 X-Frame-Options HTTP 响应头用来给浏览器一个指示。该指示的作用为&#xff1a;是否允许页面在 <frame>, </iframe> 或者 <object> 中展现。 网站可以使用此功能&#xff0c;来确保自己网站的内容没有被嵌套到别人的网站中去&#xff0c;也从而避免了…

chatGPT 帮我优化mysql查询语句 优化一下查询速度

最终效果 备份一下数据库&#xff0c;加上索引就行。25ms查询完成。 对比 加上索引之前及之后的 EXPLAIN SELECT d.sn, d.imei1, d.imei2, d.remark FROM device_info_new d INNER JOIN production_log p ON d.state ‘0’ AND p.sn d.sn AND p.imei1 d.imei1 AND p.imei2 …

在雷电模拟器9上安装magisk并安装LSPosed模块以及其Manager管理器(一)

环境&#xff1a;win10 64&#xff0c;雷电模拟器9.0.60(9)&#xff0c;Android 9。 之前我都是用雷电模拟器版本4.0.78&#xff0c;Android版本7.1.2&#xff0c;为什么本篇要使用9了呢&#xff1f;先解答下这个问题。原因如下&#xff1a;经过我的测试&#xff0c;LSPosed不支…

【递归】汉诺塔问题(Java版)

目录 1.题目解析 2.讲解算法原理 2.1.如何来解决汉诺塔问题&#xff1f; 2.2.为什么这道题可以用递归来做&#xff1f; 2.2.1 什么是递归 2.2.2 为什么会用到递归 3.如何编写递归代码&#xff1f; 4.递归的细节展开图 1.题目解析 汉诺塔问题链接 在经典汉诺塔问题中&a…

激活函数小结:ReLU、ELU、Swish、GELU等

文章目录 SigmoidTanhReLULeaky ReLUPReLUELUSoftPlus MaxoutMishSwishGELUSwiGLUGEGLU资源 激活函数是神经网络中的非线性函数&#xff0c;为了增强网络的表示能力和学习能力&#xff0c;激活函数有以下几点性质&#xff1a; 连续且可导&#xff08;允许少数点上不可导&#x…

halcon深度学习中的样本增强

一、问题描述 halcon的例程中&#xff0c;下面是最经典的语义分割例子。 但是&#xff0c;它并没做样本增强&#xff0c;因为 你看下图的代码&#xff0c;第90行&#xff0c;那两个参数都是[]&#xff0c;空的。 二、解决方案 如下图所示&#xff0c;增加了从95到108行&#…

启航kp OpenHarmony环境搭建

前提 启航kp OpenHarmony环境搭建 搭建好OpenHarmony环境 未搭建好可以参考OpenHarmony docker环境搭建 安装vscode 下载好启航kp所需的开发包和样例 下载地址 搭建过程 进入正确文件夹 首先要进入 /home/openharmony 目录下&#xff0c;如果没有打开在vsc左上角找到文…

DELL R710硬盘格式化方法备忘录

DELL R710硬盘格式化方法备忘录 本方法是全部格式化硬盘&#xff0c;不能格式化其中的某一块 开机出现带CTRLR字样后 按CTRLR 按下CTRLP三次 以上是目前硬盘的状态&#xff0c;使用中的是ONLINE状态&#xff0c; 按CTRLP&#xff0c;回到第一个界面&#xff0c;然后按F2 选择…

【线上Java项目部署Bug记录】天翼云80端口不能使用,即使暴露了也不行!!!

项目场景&#xff1a; 项目背景&#xff1a;使用Docker部署SpringBoot项目&#xff0c;前端是 Vue 项目是&#xff1a;https://gitee.com/JavaLionLi/RuoYi-Vue-Plus 服务器&#xff1a;天翼云服务器 端口&#xff1a; 问题描述 所有端口都开的好好的&#xff0c;docker的…

山西电力市场日前价格预测【2023-10-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-15&#xff09;山西电力市场全天平均日前电价为409.82元/MWh。其中&#xff0c;最高日前价格为722.95元/MWh&#xff0c;预计出现在19: 00。最低日前电价为255.87元/MWh&#xff0c;预计…

tkinter自定义组件:文件选择按钮和颜色选择按钮

文章目录 文件对话框按钮代码实现颜色对话框 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框Frame控件&#x1f48e;PanedWindow和notebook控件扫雷小游戏&#x1f48e;强行表白神器…

人工智能就业前景越来越严峻了,你还在坚持吗?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 从最近最火的chatGpt来看&#xff0c;AI时长不但没有低迷下去&#xff0c;而且还越来越好了&#xff01;去年毕业的一个朋友&#xff0c;硕士毕业&#xff0c;目前在字节做机器学习工程师&…

【Spring框架】Spring监听器的简介和基本使用

目录 一、观察者模式 1.1 模型介绍 1.2 观察者模式Demo 1.2.1 观察者实体 1.2.2 主题实体 1.2.3 测试代码 二、Spring监听器的介绍 2.1 事件&#xff08;ApplicationEvent&#xff09; 2.1.1 Spring内置事件 2.1.2 Spring内置事件 2.2 事件监听器&#xff08;Applic…

阿里云安全中心需要购买吗?功能及价格告诉你值不值!

阿里云云安全中心有必要购买吗&#xff1f;云安全中心经常提示云服务器高危漏洞&#xff0c;需要购买云安全中心吗&#xff1f;无论是云服务器上是网站还是其他应用&#xff0c;难免会存在漏洞&#xff0c;有漏洞是一定要修复的&#xff0c;云安全中心不仅可以修复漏洞还可以防…

【C++STL基础入门】list的增、删

文章目录 前言一、list迭代器1.1 list迭代器的定义 二、list增2.1 头添加2.2 尾添加2.3 中间添加 三、list删3.1 尾删除3.2 头删除3.3 删除指定元素3.4 clear()函数3.5 remove()函数3.6 unique()函数 总结 前言 在C中&#xff0c;STL&#xff08;Standard Template Library&am…