第 378 场 LeetCode 周赛题解

A 检查按位或是否存在尾随零

在这里插入图片描述

枚举:枚举两个元素的组合即可

class Solution {
public:bool hasTrailingZeros(vector<int> &nums) {int n = nums.size();for (int i = 0; i < n; i++)for (int j = 0; j < i; j++)if ((nums[i] | nums[j]) % 2 == 0)return true;return false;}
};

B 找出出现至少三次的最长特殊子字符串 I

在这里插入图片描述

同C …

class Solution {
public:int maximumLength(string s) {int n = s.size();vector<vector<int>> li(26);for (int i = 0, j = 0; i < n; i = ++j) {while (j + 1 < n && s[j + 1] == s[j])j++;li[s[i] - 'a'].push_back(j - i + 1);}int l = 0, r = n;auto can = [&](int len) {for (auto &v: li) {int cnt = 0;for (auto blk: v)if (blk >= len)cnt += blk - len + 1;if (cnt >= 3)return true;}return false;};while (l < r) {int mid = (l + r + 1) / 2;if (can(mid))l = mid;elser = mid - 1;}return l != 0 ? l : -1;}
};

C 找出出现至少三次的最长特殊子字符串 II

在这里插入图片描述

二分:首先将 s s s 划分成若干特殊子字符串,然后二分枚举答案,判断当前枚举值是否满足条件

class Solution {
public:int maximumLength(string s) {int n = s.size();vector<vector<int>> li(26);for (int i = 0, j = 0; i < n; i = ++j) {while (j + 1 < n && s[j + 1] == s[j])j++;li[s[i] - 'a'].push_back(j - i + 1);}int l = 0, r = n;auto can = [&](int len) {//判断是否存在出现至少三次长为len的特殊子字符串for (auto &v: li) {int cnt = 0;for (auto blk: v)if (blk >= len)cnt += blk - len + 1;if (cnt >= 3)return true;}return false;};while (l < r) {int mid = (l + r + 1) / 2;if (can(mid))l = mid;elser = mid - 1;}return l != 0 ? l : -1;}
};

D 回文串重新排列查询

在这里插入图片描述
在这里插入图片描述

字符串哈希 + 分类讨论:每次查询对应两个区间 [ s 1 , e 1 ] [s1,e1] [s1,e1] [ s 2 , e 2 ] [s2,e2] [s2,e2] ,两个区间的位置关系可以分为:

  • 两个区间不相交
  • 两个区间相交
    • 一个区间包含另一个区间
    • 两个区间都不包含另一个区间
class Solution {
public:using ll = long long;vector<bool> canMakePalindromeQueries(string s, vector<vector<int>> &queries) {string sl = s.substr(0, s.size() / 2), sr = s.substr(s.size() / 2, s.size() / 2);reverse(sr.begin(), sr.end());//反转s后半段srand(time(0));ll e_ = 2333 + rand() % 10;ll mod_ = 1e9 + rand() % 10;shash hl(sl, e_, mod_), hr(sr, e_, mod_);int n = sl.size();vector<vector<int>> psl(26, vector<int>(n + 1)), psr(26, vector<int>(n + 1));//各个字符出现数目的前缀和auto cmp_ps = [&](string &s, vector<vector<int>> &ps) {//计算psl、psrfor (int i = 0; i < 26; i++)ps[i][0] = 0;for (int i = 0; i < n; i++)for (int j = 0; j < 26; j++)ps[j][i + 1] = s[i] - 'a' == j ? ps[j][i] + 1 : ps[j][i];};cmp_ps(sl, psl);cmp_ps(sr, psr);auto eql = [&](int l, int r) {//判断 sl[l,r] 和 sr[l,r] 中各字符数目是否都相等for (int i = 0; i < 26; i++)if (psl[i][r + 1] - psr[i][l] != psr[i][r + 1] - psr[i][l])return false;return true;};auto ge = [&](int s1, int e1, int s2, int e2) {//判断 sl[s1,e1] 中各字符数目是否都不小于 sr[s2,e2] 中对应字符数目for (int i = 0; i < 26; i++)if (psl[i][e1 + 1] - psr[i][s1] < psr[i][e2 + 1] - psr[i][s2])return false;return true;};auto le = [&](int s1, int e1, int s2, int e2) {//判断 sl[s1,e1] 中各字符数目是否都不大于 sr[s2,e2] 中对应字符数目for (int i = 0; i < 26; i++)if (psl[i][e1 + 1] - psr[i][s1] > psr[i][e2 + 1] - psr[i][s2])return false;return true;};vector<bool> res(queries.size(), false);for (int ind = 0; ind < queries.size(); ind++) {int s1 = queries[ind][0], e1 = queries[ind][1], s2 = n * 2 - 1 - queries[ind][3], e2 = n * 2 - 1 - queries[ind][2];if (e1 < s2 || e2 < s1) {//两个区间不相交if (e2 < s1) {swap(s1, s2);swap(e1, e2);}if (s1 != 0 && hl(0, s1 - 1) != hr(0, s1 - 1))continue;if (e1 + 1 < s2 && hl(e1 + 1, s2 - 1) != hr(e1 + 1, s2 - 1))continue;if (e2 != n - 1 && hl(e2 + 1, n - 1) != hr(e2 + 1, n - 1))continue;if (!eql(s1, e1) || !eql(s2, e2))continue;} else {//两个区间相交if (s1 <= s2 && e1 >= e2) {//[s1,e1] 包含 [s2,e2]if (s1 != 0 && hl(0, s1 - 1) != hr(0, s1 - 1) || e1 != n - 1 && hl(e1 + 1, n - 1) != hr(e1 + 1, n - 1))continue;if (!eql(s1, e1))continue;} else if (s2 <= s1 && e2 >= e1) {[s2,e2] 包含 [s1,e1]if (s2 != 0 && hl(0, s2 - 1) != hr(0, s2 - 1) || e2 != n - 1 && hl(e2 + 1, n - 1) != hr(e2 + 1, n - 1))continue;if (!eql(s2, e2))continue;} else {//两个区间相交,且任意一个都不包含另一个if (s1 < s2) {// s1<s2<=e1<=e2if (s1 != 0 && hl(0, s1 - 1) != hr(0, s1 - 1) || e2 != n - 1 && hl(e2 + 1, n - 1) != hr(e2 + 1, n - 1))continue;if (!ge(s1, e1, s1, s2 - 1) || !le(e1 + 1, e2, s2, e2) || !eql(s1, e2))continue;} else {//s2<s1<=e2<=s1if (s2 != 0 && hl(0, s2 - 1) != hr(0, s2 - 1) || e1 != n - 1 && hl(e1 + 1, n - 1) != hr(e1 + 1, n - 1))continue;if (!le(s2, s1 - 1, s2, e2) || !ge(s1, e1, e2 + 1, e1) || !eql(s2, e1))continue;}}}res[ind] = true;}return res;}class shash {//字符串哈希模板public:vector<ll> pres;vector<ll> epow;ll e, p;shash(string &s, ll e, ll p) {int n = s.size();this->e = e;this->p = p;pres = vector<ll>(n + 1);epow = vector<ll>(n + 1);epow[0] = 1;for (int i = 0; i < n; i++) {pres[i + 1] = (pres[i] * e + s[i]) % p;epow[i + 1] = (epow[i] * e) % p;}}ll operator()(int l, int r) {ll res = (pres[r + 1] - pres[l] * epow[r - l + 1] % p) % p;return (res + p) % p;}};
};

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

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

相关文章

平面光波导_三层均匀平面光波导_射线分析法

平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导&#xff1a; 折射率沿 x x x 方向有变化&#xff0c;沿 y y y、 z z z 方向没有变化三层&#xff1a;芯区( n 1 n_1 n1​) > > > 衬底( n 2 n_2 n2​) ≥ \geq ≥ 包层( n 3 n_3 n3​)包层通常为空…

【排序算法】四、堆排序(C/C++)

「前言」文章内容是排序算法之堆排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 堆排序1.1 原理1.2 堆的向下调整1.3 堆排序代码实现1.3 性质总结 堆排序 1.1 原理 概念介…

推荐一下最近在看到比较好的小报童

最近订阅了很多优秀的小报童 说真的&#xff0c;在知识付费领域&#xff0c;小报童是一个弟弟&#xff0c;但是这种模式却非常棒 轻量级交付&#xff0c;靠口碑传播 这对于想进入知识付费领域&#xff0c;但是又不想重交付的人来说&#xff0c;确实是一个很好的平台 下面推…

git 中的概念

git 中的概念 在使用 Git 版本控制的过程中&#xff0c;有些概念我们必须有所了解&#xff0c;这样才能更有效率也更有意义的学下去。 有清楚且正确的概念认知&#xff0c;不但有助于我们学习如何操作 Git 命令&#xff0c;更重要的是&#xff0c;学习 Git 的相关知识也会更加…

【【ZYNQ基础模块串口的意义】】

ZYNQ基础模块串口的意义 ZYNQ的配置介绍 如此纯粹的引脚显示 DDR 用来接DDR FIXED_IO 主要用来调试 现在一步一步配置出PS与PL端想沟通的zynq核 第一步给PL端添加一个时钟 因为 PS 与 PL端的时钟晶振不一样 我们可以通过一个PLL 来帮助我们生成想要实现的PL端时钟 第二步…

程序员有哪些接单的渠道?

这题我会&#xff01;程序员接单的渠道那可太多了&#xff0c;想要接到合适的单子&#xff0c;筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道&#xff0c;可以参考以下这些方向。 首先&#xff0c;程序员要对接单有一个基本的概念&#xff1a;接单渠道可以先粗略…

gseaplot3修改一下clusterProfiler默认绘图函数

直接使用clusterProfiler::gseaplot2绘图会出现下边的结果&#xff0c;导致四周显示不全&#xff0c;线的粗细也没办法调整&#xff0c;因为返回的是一个aplot包中的gglist对象&#xff0c;没太多研究。 p1 <- clusterProfiler::gseaplot2(gsea_result, gsea_result$ID, pv…

行为型模式 | 观察者模式

一、观察者模式 1、原理 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象&#xff0c;这个主题对象在状态上发生变化时&#xff0c;会通知所有观察者对象&#xff0…

Camunda Rest API

客户端像调用本地方法一样调用引擎中的接口。 https://docs.camunda.org/manual/7.17/reference/rest/ 一&#xff1a;pom.xml <dependency><groupId>org.camunda.community.rest</groupId><artifactId>camunda-platform-7-rest-client-spring-boot-…

【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

【Docker】概述与安装

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. Docker的概述 1.Docker为什么出现 2…

【设计模式-7】门面模式的代码实现和应用场景

门面模式&#xff0c;最简单的结构性设计模式&#xff0c;将多个不同的子系统逻辑封装起来&#xff0c;对外提供统一的调用接口。门面模式又叫做外观模式&#xff0c;可能是我们接触最多的模式&#xff0c;在开发中&#xff0c;可能不经意间就用到了门面模式。 1. 概述 门面模…