Leetcode 第 378 场周赛题解

Leetcode 第 378 场周赛题解

  • Leetcode 第 378 场周赛题解
    • 题目1:2980. 检查按位或是否存在尾随零
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2981. 找出出现至少三次的最长特殊子字符串 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2982. 找出出现至少三次的最长特殊子字符串 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2983. 回文串重新排列查询
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 378 场周赛题解

题目1:2980. 检查按位或是否存在尾随零

思路

遍历。

给你一个 正整数数组 nums 。

你需要检查是否可以从数组中选出两个或更多元素,满足这些元素的按位或运算( OR)结果的二进制表示中至少存在一个尾随零(最低位为 0)。

或运算要求两个元素的最低位都为 0,才能使得结果的最低位为 0,即至少存在一个尾随零。

于是问题转换为正整数数组 nums 至少存在 2 个最低位为 0 的元素,即至少存在 2 个偶数。

代码

/** @lc app=leetcode.cn id=2980 lang=cpp** [2980] 检查按位或是否存在尾随零*/// @lc code=start
class Solution
{
public:bool hasTrailingZeros(vector<int> &nums){int count = 0;for (int &num : nums)if (num % 2 == 0)count++;return count >= 2;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。

题目2:2981. 找出出现至少三次的最长特殊子字符串 I

思路

滑动窗口枚举窗口内字符相同的字符串,再暴力枚举长度相等的字符串。

代码

/** @lc app=leetcode.cn id=2981 lang=cpp** [2981] 找出出现至少三次的最长特殊子字符串 I*/// @lc code=startclass Solution
{
public:int maximumLength(string s){// 特判if (s.empty())return 0;int n = s.size();int ans = -1, left = 0;for (int right = 0; right < n; right++){while (s[left] != s[right])left++;int len = right - left + 1;string sub = s.substr(left, len);int count = 1;// 暴力枚举所有的子字符串for (int i = left + 1; i < n; i++){string temp = s.substr(i, len);if (sub == temp){count++;if (count >= 3){ans = max(ans, len);break;}}}}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n2),其中 n 是字符串 s 的长度。

空间复杂度:O(1)。现至少三次的最长特殊子字符串 II

题目3:2982. 找出出现至少三次的最长特殊子字符串 II

思路

字符串分割 + 分类讨论。

按照相同字母分组,每组统计相同字母连续出现的长度。例如 aaaabbbabb 把 a 分成一组,组内有长度 4 和长度 1;把 b 分成一组,组内有长度 3 和长度 2。

单独考虑每一组,按照长度从大到小排序,设长度列表为 group。

分类讨论:

  1. 从最长的特殊子串(group[0])中取三个长度均为 group[0]−2 的特殊子串。例如示例 1 的 aaaa 可以取三个 aa。
  2. 从最长和次长的特殊子串(group[0]、group[1])中取三个长度一样的特殊子串:min⁡(group[0]−1, group[1])。
  3. 从最长、次长、第三长的的特殊子串(group[0]、group[1]、group[2])中各取一个长为 group[2]的特殊子串。

这三种情况取最大值,即:max({group[0] - 2, min(group[0] - 1, group[1]), group[2]})。取每一组的最大值,即为答案。

如果答案是 0,返回 −1。

代码实现时,无需特判 group 数组长度小于 3 的情况,我们只需要在数组添加两个空串(在数组末尾加两个 0)即可。

代码

/** @lc app=leetcode.cn id=2981 lang=cpp** [2981] 找出出现至少三次的最长特殊子字符串 I*/// @lc code=start
class Solution
{
public:int maximumLength(string s){// 特判if (s.empty())return 0;vector<int> groups[26];int n = s.length();int count = 0;for (int i = 0; i < n; i++){count++;if (i + 1 == n || s[i] != s[i + 1]){groups[s[i] - 'a'].push_back(count); // 统计连续字符长度count = 0;}}int ans = 0;for (vector<int> &group : groups){if (group.empty())continue;// 降序排序sort(group.begin(), group.end(), greater<int>());// 假设还有两个空串group.push_back(0);group.push_back(0);ans = max({ans, group[0] - 2, min(group[0] - 1, group[1]), group[2]});}return ans == 0 ? -1 : ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn),其中 n 是字符串 s 的长度。

空间复杂度:O(n),其中 n 是字符串 s 的长度。

题目4:2983. 回文串重新排列查询

思路

大模拟。

题解:分类讨论(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=2983 lang=cpp** [2983] 回文串重新排列查询*/// @lc code=start
class Solution
{
public:vector<bool> canMakePalindromeQueries(string s, vector<vector<int>> &queries){// 分成左右两半,右半反转int n = s.length() / 2;string t = s.substr(n);reverse(t.begin(), t.end());// 预处理三种前缀和vector<vector<int>> sum_s(n + 1, vector<int>(26));for (int i = 0; i < n; i++){sum_s[i + 1] = sum_s[i];sum_s[i + 1][s[i] - 'a']++;}vector<vector<int>> sum_t(n + 1, vector<int>(26));for (int i = 0; i < n; i++){sum_t[i + 1] = sum_t[i];sum_t[i + 1][t[i] - 'a']++;}vector<int> sum_ne(n + 1);for (int i = 0; i < n; i++){sum_ne[i + 1] = sum_ne[i] + (s[i] != t[i]);}// 计算子串中各个字符的出现次数,闭区间 [l, r]auto count = [](vector<vector<int>> &sum, int l, int r) -> vector<int>{auto res = sum[r + 1];for (int i = 0; i < 26; i++){res[i] -= sum[l][i];}return res;};auto subtract = [](vector<int> s1, vector<int> s2) -> vector<int>{for (int i = 0; i < 26; i++){s1[i] -= s2[i];if (s1[i] < 0){return {};}}return s1;};auto check = [&](int l1, int r1, int l2, int r2, vector<vector<int>> &sumS, vector<vector<int>> &sumT) -> bool{if (sum_ne[l1] > 0 || // [0, l1-1] 有 s[i] != t[i]sum_ne[n] - sum_ne[max(r1, r2) + 1] > 0){ // [max(r1,r2)+1, n-1] 有 s[i] != t[i]return false;}// 区间包含if (r2 <= r1){return count(sumS, l1, r1) == count(sumT, l1, r1);}// 区间不相交if (r1 < l2){return sum_ne[l2] - sum_ne[r1 + 1] == 0 && // [r1+1, l2-1] 都满足 s[i] == t[i]count(sumS, l1, r1) == count(sumT, l1, r1) &&count(sumS, l2, r2) == count(sumT, l2, r2);}// 区间相交但不包含auto s1 = subtract(count(sumS, l1, r1), count(sumT, l1, l2 - 1));auto s2 = subtract(count(sumT, l2, r2), count(sumS, r1 + 1, r2));return !s1.empty() && !s2.empty() && s1 == s2;};vector<bool> ans(queries.size());for (int i = 0; i < queries.size(); i++){auto &q = queries[i];int l1 = q[0], r1 = q[1], l2 = n * 2 - 1 - q[3], r2 = n * 2 - 1 - q[2];ans[i] = l1 <= l2 ? check(l1, r1, l2, r2, sum_s, sum_t) : check(l2, r2, l1, r1, sum_t, sum_s);}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O((n+q)∣Σ∣),其中 n 为字符串 s 的长度,q 为数组 queries 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26。回答每个询问的时间是 O(∣Σ∣)。

空间复杂度:O(n∣Σ∣),其中 n 为字符串 s 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26。

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

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

相关文章

[开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 1. Python中的赋值、浅拷贝、深拷贝2. C中的赋值、浅拷贝、深拷贝2.1 概念2.2 示例&#xff1a;从例子中理解1) 不可变对象的赋值、深拷贝、浅拷贝2) 可变对象的赋值、浅拷贝与深拷贝3) **可变对象深浅拷贝(外层、内层改变元素)** 写在前面&…

资源三角形

美国哈佛大学的研究小组提出了著名的资源三角形&#xff1a;没有物质&#xff0c;什么也不存在&#xff1b;没有能量&#xff0c;什么也不会发生&#xff1b;没有信息&#xff0c;任何事物都没有意义。物质、能量和信息是相互有区别的&#xff0c;是人类社会赖以生存、发展的三…

关于QUOTENAME的用法

关于QUOTENAME的用法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同探讨在数据库开发中经常使用的函数之一——“QUOTENAME”&#xff…

vue中slot的用法

在Vue中&#xff0c;slot用于在父组件中传递内容到子组件中。可以通过在子组件中使用<slot></slot>标签来创建一个插槽&#xff0c;父组件可以在子组件标签中插入内容&#xff0c;这些内容将会被渲染到子组件中的插槽位置。 下面是slot的用法示例&#xff1a; &l…

Nginx负载均衡以及常用的7层协议和4层协议的介绍

一、引言 明人不说暗话&#xff0c;下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。 二、nginx负载均衡的作用 高并发&#xff1a;负载均衡通过算法调整负载&#xff0c;尽力均匀的分配应用集群中各节点的工作量&#xff0c;以此提高应用集群的并发处理能力…

Ftrans飞驰云联荣获“CSA 2023安全创新奖”

2023年12月21日&#xff0c;第七届云安全联盟大中华区大会在深圳成功举办。会上&#xff0c;CSA大中华区发布了多个研究成果并进行 CSA 2023年度颁奖仪式&#xff0c;Ftrans飞驰云联以其突出的技术创新能力和广泛的市场应用前景&#xff0c;荣获备受瞩目的“CSA 2023安全创新奖…

常用python代码大全-python使用multiprocessing模块进行多进程编程

Python的multiprocessing模块提供了一种简单的方式来创建多进程程序。以下是一个简单的示例&#xff0c;说明如何使用multiprocessing模块创建多个进程&#xff1a; import multiprocessingdef worker_process(num):print(f"Worker {num} is working")if __name__ …

【算法与数据结构】62、LeetCode不同路径

文章目录 一、题目二、解法2.1 动态规划解法2.2 数论解法 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 2.1 动态规划解法 思路分析&#xff1a;机器人只能向下或者向右移动&#xff0c;那么到达&a…

学习Django前你需要知道的

1. 简介 官方文档&#xff1a;https://docs.djangoproject.com/zh-hans/4.2/ Django是一个开放源码的Web应用框架&#xff0c;由Python写成。采用了MVT的框架模式&#xff0c;即模型M&#xff0c;视图V和模板T。它最初是被开发用来管理劳伦斯出版集团旗下的一些以新闻内容为主…

leetcode 2645. 构造有效字符串的最少插入数-python

题目&#xff1a; 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

【剪枝】【广度优先】【深度优先】488祖玛游戏

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 剪枝 广度优先 深度优先 488祖玛游戏 在这个祖玛游戏变体中&#xff0c;桌面上有 一排 彩球&#xff0c;每个球的颜色可能是&#xff1a;红色 ‘R’、黄色 ‘Y’、蓝色 ‘B’、绿色 ‘G’ 或白色 ‘W’ 。你的手中也有一些…

kubeadm安装kubernetes

基本环境配置 节点分为&#xff1a;master&#xff0c;node&#xff0c;masterlb(keepalived虚拟Ip&#xff0c;不占用机器) k8s-master01 16 k8s-node01 113 15 k8s-node02 115 进入之后直接选done done 上海 123456 设置静态ip 然后去虚拟机里面设置ens即可 查看命…

MFC为对话框资源添加类

VC6新建一个对话框类型的工程; 建立之后资源中默认有2个对话框,一个是主对话框,About这个是默认建立的关于版权信息的; 然后主对话框有对应的.h和.cpp文件;可以在其中进行编程; 默认建立的有一个 关于 对话框; 在资源中新插入一个对话框,IDD_DIALOG1是对话框ID; 新加…

连接数问题

连接数问题 在使用mysql时有时候会报too many connections错误&#xff0c;这是连接数过多导致的&#xff0c;然后就会去修改max_connections参数&#xff0c;但是这个参数也不能无上限的增大&#xff0c;容易造成机器内存不足&#xff0c;还是需要找到为什么会有这么多连接的原…

国际版WPS Office 18.6.1

【应用名称】&#xff1a;WPS Office 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#WPS 【应用版本】&#xff1a;18.6.1 【应用大小】&#xff1a;160MB 【软件说明】&#xff1a;软件日常更新。WPS Office是使用人数最多的移动办公软件。独有手机阅读模式…

LLM主流框架:Causal Decoder、Prefix Decoder和Encoder-Decoder

本文将介绍如下内容&#xff1a; transformer中的mask机制Causal DecoderPrefix DecoderEncoder Decoder总结 一、transformer中的mask机制 在Transformer模型中&#xff0c;mask机制是一种用于在self-attention中的技术&#xff0c;用以控制不同token之间的注意力交互。具体…

【Redis】Redis初识

一、redis概述 1、redis redis&#xff1a;一款高性能的NOSQL系列的非关系型数据库redis 2、NoSQL NoSQL&#xff1a;泛指非关系型的数据库 NOSQL分类&#xff1a; 键值(Key-Value)存储数据库&#xff1a;内容缓存&#xff0c;主要用于处理大量数据的高访问负载列存储数据…

VUE 前端框架学习总结

Vue 的核心库只关注视图层&#xff0c;方便与第三方库或既有项目整合。 视图层即页面展示&#xff08;给用户看的部分&#xff09;&#xff0c;刷新后台给的数据&#xff1a;HTML CSS JS Vue 只负责视图层&#xff0c;其他前端部分有以下技术解决 网络通信 &#xff1a; axi…

探索WPF控件内容模型的四大支柱

WPF 内容模型 WPF控件内容模型主要指派生于System.Windows.Controls.Control类的各种控件&#xff0c;有四个可包含任意内容的类。 下表列出了继承自 Control 的类。 ContentControl&#xff1a;用于包含一段任意类型的内容。但是只能包含一个子元素作为其“内容”。它可以包…

arm服务器和麒麟v10安装nacos

在arm飞腾服务器和麒麟V10SP3上安装nacos 服务器和系统版本 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.22.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (S…