首页 > 其他分享 >剑指 Offer II 005. 单词长度的最大乘积

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

时间:2023-04-21 15:14:28浏览次数:48  
标签:005 Offer int 复杂度 II words 字符串

题目链接:剑指 Offer II 005. 单词长度的最大乘积

方法:转化为二进制位 + 位运算

解题思路

  • 将 \(words[i]\) 字符串中包含的字母转换为二进制位上的 \(1\),字符 'a' 对应二进制中的第 \(0\) 位上的 \(1\),这样每个字符串就对应一个二进制数。
  • 通过两个字符串的二进制数进行 '&' 运算,结果为 \(0\) ,表示无重复字符,否则则表示有。

代码

class Solution{
public:
    int maxProduct(vector<string>& words) {
        int n = words.size();
        vector<int> mask;
        for (auto &str : words) {
            int cur = 0;
            for (auto &c : str) {
                cur |= (1 << (c - 'a'));
            }
            mask.push_back(cur);
        }
        int ans = 0;
        for (int i = 0; i < n; i ++ ) {
            for (int j = i + 1; j < n; j ++ ) {
                if ((mask[i] & mask[j]) == 0) {
                    int len = words[i].length() * words[j].length();
                    ans = max(ans, len);
                }
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(L + n^2),L 为所有字符串长度总和,n 为字符串数量\);
空间复杂度:\(O(n)\)。

标签:005,Offer,int,复杂度,II,words,字符串
From: https://www.cnblogs.com/lxycoding/p/17339922.html

相关文章

  • IIS 内存溢出(32位程序运行)
    背景最近新接手了一个项目,服务器正常,用户量也没有变化,不定时出现内存溢出,重启iis或者回收线程就正常了review发现,因为业务原因缓存的东西并没有释放掉,但远远没有达到服务器内存上线,也没有受到预警邮件巴拉很久,发现32位系统存在内存上限为什么32位程序只能使用最大2GB内......
  • 4/21 力扣 82. 删除排序链表中的重复元素 II
    给定一个已排序的链表的头 head, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。 示例1:输入:head=[1,2,3,3,4,4,5]输出:[1,2,5]示例2:输入:head=[1,1,1,2,3]输出:[2,3] 提示:链表中节点数目在范围[0,300]内-100<=Node.val<=100题目......
  • GD32F470II芯片LVGL不同驱动方式对比
    1、硬件对比屏幕尺寸:800*480 颜色格式:RGB565一帧数据:800*480*2=768000=750kLCD频率:32MHz/768000=41HZlvglfps:33优化等级:AC5-O3新硬件:GD32F470IISDRAM:32bit带宽,120MHzMCU:240MHz,768KRAM,2MFlashlv_demo_b......
  • 二分查找:剑指 Offer 53 - I. 在排序数组中查找数字 I
    题目描述:统计一个数字在排序数组中出现的次数。 提示:•0<=nums.length<=105•-109 <=nums[i] <=109•nums 是一个非递减数组•-109 <=target <=109 解题思路:排序数组中的搜索问题,首先想到二分法解决。排序数组nums中的所有数字target......
  • 剑指offer刷题 进度:JZ8
    题目列表https://www.nowcoder.com/ta/coding-interviewsJZ3数组中重复的数字时间空间复杂度都为\(O(n)\),直接建一个数组a,初始化全0,出现数i就a[i]++intduplicate(vector<int>&numbers){constintN=10005;vector<int>count(N,0);for......
  • ASCII码图
    ASCII(AmericanStandardCodeforInformationInterchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC646。......
  • 汉诺塔VII 1997 (技巧+递推)
    汉诺塔VIITimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):1261    AcceptedSubmission(s):838ProblemDescriptionn个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。......
  • 【DP】LeetCode 132. 分割回文串 II
    题目链接132.分割回文串II思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums[i]为结尾的状态;dp[i][j]分别表示以nums1[i]和nums2[j]为结尾的状态,以此类......
  • 二分查找:剑指 Offer 11. 旋转数组的最小数字
    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]为[1,2,3,4,5]的一次旋转,该数组的最......
  • #yyds干货盘点# LeetCode面试题:搜索旋转排序数组 II
    1.简述:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2......