Leetcode 2983. Palindrome Rearrangement Queries

  • Leetcode 2983. Palindrome Rearrangement Queries
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:2983. Palindrome Rearrangement Queries

1. 解题思路

这道题看了一下,截至我写的时候,只有103个大佬给出了这个题目的解答,而且这次的竞赛第一名的大佬也花了将近30min,基本时间都卡在这道题上面,因此能把这道题搞出来还是有些开心的。

整体的话,这道题个人感觉复杂在分类讨论上,有一些特殊情况需要注意一下,注意到了的话其实整体的思路还是挺清晰的。下面,我们就来具体看看这道题目的解答。

显然对于 N N N个独立的query要求解的话,那么我们就要求能够在至多 O ( l o g N ) O(logN) O(logN)的时间复杂度内直接求出任意一个query能否对其构成回文。

而我们考察任意一个query: ( a , b , c , d ) (a,b,c,d) (a,b,c,d),其中, ( c , d ) (c,d) (c,d)在中轴左侧对应得到的节点我们记作 ( c ′ , d ′ ) (c', d') (c,d)

对于与上述query的空间不相交的部分,我们需要快速的判断这些空间内的元素是否恰好符合回文的特性,即 s i = s n − 1 − i s_i = s_{n-1-i} si=sn1i,这个,我们可以通过segment tree来在 O ( l o g N ) O(logN) O(logN)的时间复杂度内对任意区间内判断其是否都符合回文特性。

而对于相交的部分,本质上,我们只需要判断这些部分的字符种类和数目是否完全一致,我们就能够判断其是否能够构成回文,但是,他们的交叉性关系会使得我们的讨论略微复杂。

这里,出于讨论的简单性,我们不妨假设 a ≤ c ′ a \leq c' ac,此时,我们即会有以下几种交叉情况:

  1. 独立关系: a ≤ b < c ′ ≤ d ′ a \leq b < c' \leq d' ab<cd
  2. 包含关系: a ≤ c ′ ≤ d ′ ≤ b a \leq c' \leq d' \leq b acdb
  3. 交叉关系: a ≤ c ′ ≤ b ≤ d ′ a \leq c' \leq b \leq d' acbd

下面,我们来对着三种情况进行分类讨论:

  1. 独立关系

    此时,我们只需判断两个区间是否都满足字符一致性即可。

  2. 包含关系

    此时,我们只需要判断大的区间的字符一致性即可。

  3. 交叉关系

    交叉关系是其中最为复杂的一种情况,我们需要判断交叉的大区间内的字符一致性,即 ( a , d ′ ) (a, d') (a,d) ( c , b ′ ) (c, b') (c,b)两端区间里面的字符一致性。

    除此之外,显然 ( b , d ′ ) (b, d') (b,d)区间的字符不能交换,但是必须由 ( c , d ) (c,d) (c,d)之间的字符交换顺序得到,同样的, ( d , b ′ ) (d, b') (d,b)区间的字符也不能变换顺序,只能由 ( a , b ) (a,b) (a,b)区间的字符变换顺序得到,因此我们需要额外多加两个包含性关系判断条件。

综上,组合三种关系下的判断条件,我们就能够获得整个题目的解答。

2. 代码实现

给出python代码实现如下:

class SegmentTree:def __init__(self, arr):self.length = len(arr)self.tree = self.build(arr)def feature_func(self, *args):return sum(args)def build(self, arr):n = len(arr)tree = [0 for _ in range(2*n)]for i in range(n):tree[i+n] = arr[i]for i in range(n-1, 0, -1):tree[i] = self.feature_func(tree[i<<1], tree[(i<<1) | 1])return treedef update(self, idx, val):idx = idx + self.lengthself.tree[idx] = valwhile idx > 1:self.tree[idx>>1] = self.feature_func(self.tree[idx], self.tree[idx ^ 1])idx = idx>>1returndef query(self, lb, rb):lb += self.length rb += self.lengthnodes = []while lb < rb:if lb & 1 == 1:nodes.append(self.tree[lb])lb += 1if rb & 1 == 0:nodes.append(self.tree[rb])rb -= 1lb = lb >> 1rb = rb >> 1if lb == rb:nodes.append(self.tree[rb])return self.feature_func(*nodes)class Solution:def canMakePalindromeQueries(self, s: str, queries: List[List[int]]) -> List[bool]:n, m = len(s), len(s) // 2cnt = [[0 for _ in range(26)] for _ in range(n+1)]for i, ch in enumerate(s):for j in range(26):cnt[i+1][j] = cnt[i][j]cnt[i+1][ord(ch) - ord('a')] += 1matched = [1 if s[i] == s[n-1-i] else 0 for i in range(m)]segment_tree = SegmentTree(matched)@lru_cache(None)def query_inner(a, b, c, d):lb = min(a, n-1-d)rb = max(b, n-1-c)cnt1 = [cnt[rb+1][i]-cnt[lb][i] for i in range(26)]cnt2 = [cnt[n-lb][i]-cnt[n-1-rb][i] for i in range(26)]ans = all(x == y for x, y in zip(cnt1, cnt2))return ans@lru_cache(None)def query_inclusive(a, b, c, d):cnt1 = [cnt[b+1][i]-cnt[a][i] for i in range(26)]cnt2 = [cnt[d+1][i]-cnt[c][i] for i in range(26)]ans = all([x >= y for x, y in zip(cnt1, cnt2)])return ans@lru_cache(None)def query_outer(a, b):if b < a:ans = Trueelse:ans = (b-a+1 == segment_tree.query(a, b))return ans@lru_cache(None)def query(a, b, c, d):a1, b1, c1, d1 = n-1-b, n-1-a, n-1-d, n-1-cif b < c1:return query_inner(a, b, n-1-a, n-1-b) and query_inner(c1, d1, c, d) and query_outer(0, a-1) and query_outer(b+1, c1-1) and query_outer(d1+1, m-1)elif a > d1:return query_inner(a, b, n-1-a, n-1-b) and query_inner(c1, d1, c, d) and query_outer(0, c1-1) and query_outer(d1+1, a-1) and query_outer(b+1, m-1)elif a <= c1 <= d1 <= b or c1 <= a <= b <= d1:return query_inner(a, b, c, d) and query_outer(0, min(a, c1)-1) and query_outer(max(b, d1)+1, m-1)elif a <= c1 <= b <= d1:return query_inner(a, b, c, d) and query_outer(0, a-1) and query_outer(d1+1, m-1) and query_inclusive(a, b, d+1, b1) and query_inclusive(c, d, b+1, d1)else:return query_inner(a, b, c, d) and query_outer(0, c1-1) and query_outer(b+1, m-1) and query_inclusive(a, b, a1, c-1) and query_inclusive(c, d, c1, a-1)ans = [query(a, b, c, d) for a, b, c, d in queries]return ans

提交代码评测得到:耗时3414ms,占用内存76.1MB。

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

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

相关文章

Go语言中的HTTP重定向

大家好&#xff0c;我是你们可爱的编程小助手&#xff0c;今天我们要一起探讨如何使用Go语言实现HTTP重定向&#xff0c;让我们开始吧&#xff01; 大家都知道&#xff0c;网站开发中有时候需要将用户的请求从一个URL导向到另一个URL。比如说&#xff0c;你可能想将旧的URL结构…

Redis 数据结构和常用命令

* 代表多个&#xff0c;&#xff1f;代表一个 &#xff08;不用全部敲出来&#xff0c;按住tab可以自动补全&#xff09; -2是无效&#xff0c;-1是永久有效 &#xff1b;贴心小提示&#xff1a;内存非常宝贵&#xff0c;对于一些数据&#xff0c;我们应当给他一些过期时间&a…

attempted relative import beyond top-level package

attempted relative import beyond top-level package 这个错误通常发生在 Python 中尝试使用超出顶层包范围的相对导入时。Python 的相对导入是基于模块之间的相对位置进行的&#xff0c;因此&#xff0c;如果相对导入超出了顶层包的范围&#xff0c;就会报这个错误。 解决方法…

计算机组成原理-总线概述

文章目录 总线简图总线的物理实现总览总线定义总线的特性总线的分类按数据格式分类串行总线并行总线 按总线功能分类注意系统总线的进一步分类 总线的结构单总线的机构双总线的结构三总线的结构四总线的结构 小结 总线简图 总线的物理实现 如果该为数据总线&#xff0c;那么当…

Hive详解、配置、数据结构、Hive CLI

一、Hive 认识 1. Hive 应用 问题&#xff1a;公司的经营状况&#xff1f; 主题一&#xff1a;财务现金流指标1.1&#xff1a;净现金流入/流出量指标1.2&#xff1a;现金转换周期预算执行状况指标2.1&#xff1a;预算内成本控制指标2.2&#xff1a;预算与实际支出的差异 主题…

图文证明 泰勒公式展开

泰勒公式 泰勒公式简单来说就是,可以用一个N次多项式来表示出一个连续可导的函数 f(x) 是一个用函数在某点的信息描述其附近取值的公式 第一步 思考 这是一个sin(x)的图像 用函数在原点的信息描述其附近取值 用一阶导数贴合: 直接用切线来贴合就好 画一个点(0,sin(0)除的切…

MySQL使用问题记录

在使用MybatisPlus做一个记录的查询&#xff0c;出现一个奇怪的错误&#xff0c;异常信息如下&#xff1a; line 1:136 mismatched input source expecting {!, ~, , -, ., (, {, ?, , TRUNCATE, POSITION, VIEW, VALUES, CASE, CAST, TRIM, SUBSTRING, LEFT, RIGHT, IF, NOT…

Nginx和OpenResty面试题及简单示例

简要解释Nginx的工作原理 Nginx的工作原理&#xff1a; Nginx采用事件驱动和异步非阻塞的架构。它通过一个主进程和多个工作进程处理客户端请求。当有新的请求到达时&#xff0c;主进程接受并分发请求给空闲的工作进程进行处理。Nginx使用高效的I/O多路复用机制&#xff0c;可…

[NISACTF 2022]babyupload

[NISACTF 2022]babyupload wp 信息搜集 进入页面&#xff1a; 尝试文件上传&#xff0c;但是各种后缀名我都试过了&#xff0c;过不去。 在源码中发现提示&#xff0c;存在 ./source 路径&#xff1a; 访问该路径得到源码&#xff1a; from flask import Flask, request, r…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…

精品Nodejs实现的在线菜谱食谱美食学习系统的设计与实现

《[含文档PPT源码等]精品Nodejs实现的在线菜谱学习系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows…

day5--java基础编程:异常,内部类

6 异常 6.1 异常概述 出现背景&#xff1a; 在使用计算机语言进行项目开发的过程中&#xff0c;即使程序员把代码写得尽善尽美&#xff0c;在系统的运行过程中仍然会遇到一些问题&#xff0c;因为很多问题不是靠代码能够避免的&#xff0c;比如:客户输入数据的格式&#xff0c…

逆变器在光伏发电系统中的作用是什么?安装时应注意哪些事项?

在光伏发电系统中&#xff0c;逆变器是一个至关重要的组件&#xff0c;主要作用是什么&#xff1f; 1.是将直流电转换为交流电的关键&#xff1a;太阳能电池板所产生的电能是直流电&#xff0c;逆变器可将直流电转换为交流电&#xff0c;是的太阳能电池板所产生的电能可以被家…

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

图片处理软件,批量缩放图片尺寸

无论是社交媒体上的分享&#xff0c;还是工作中的图片素材&#xff0c;往往大小不一、形状不同&#xff0c;这时如何批量高效地对这些图片进行缩放就显得尤为重要。传统的图片处理软件&#xff0c;不仅操作复杂&#xff0c;而且处理速度慢&#xff0c;更无法实现批量化处理。但…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

【LeetCode:17. 电话号码的字母组合 | 递归 + 回溯 + 组合】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

计算机网络【DNS】

DNS 基本概述 与 HTTP、FTP 和 SMTP 一样&#xff0c;DNS 协议也是应用层的协议&#xff0c;DNS 使用客户-服务器模式运行在通信的端系统之间&#xff0c;在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特…

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…

three.js GLTFLoader加载的glb/gltf色去色彩都成了黑白色 问题解决

如下代码 const gltfLoader new GLTFLoader(); gltfLoader.load(// 模型路径"/gltf/scene.gltf",// 加较完成同调(gltf) >{gltf.scene.traverse((child) > {if (child.isMesh) {child.frustumCulled false;child.castShadow true;child.material.emissive …