Leetcode 第 378 场双周赛 Problem D 回文串重新排列查询(Java + 区间相交关系 + 前缀和)

文章目录

  • 题目
  • 思路
    • Java + 区间相交关系 + 前缀和:
    • 第 1 步:
    • 第 2 步:
    • 第 3 步:
    • 第 4 步:
  • 复杂度
  • Code

题目

  • 100129. 回文串重新排列查询
  • 给你一个长度为 偶数 n ,下标从 0 开始的字符串 s 。
  • 同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [ai, bi, ci, di] 。
  • 对于每个查询 i ,你需要执行以下操作:
    • 将下标在范围 0 <= ai <= bi < n / 2 内的 子字符串 s[ai:bi] 中的字符重新排列。
    • 将下标在范围 n / 2 <= ci <= di < n 内的 子字符串 s[ci:di] 中的字符重新排列。
  • 对于每个查询,你的任务是判断执行操作后能否让 s 变成一个 回文串 。
  • 每个查询与其他查询都是 独立的 。
  • 请你返回一个下标从 0 开始的数组 answer ,如果第 i 个查询执行操作后,可以将 s 变为一个回文串,那么 answer[i] = true,否则为 false 。
    • 子字符串 指的是一个字符串中一段连续的字符序列。
    • s[x:y] 表示 s 中从下标 x 到 y 且两个端点 都包含 的子字符串。
  • 2 <= n == s.length <= 10 ^ 5
  • 1 <= queries.length <= 10 ^ 5
  • queries[i].length == 4
  • ai == queries[i][0], bi == queries[i][1]
  • ci == queries[i][2], di == queries[i][3]
  • 0 <= ai <= bi < n / 2
  • n / 2 <= ci <= di < n
  • n 是一个偶数。
  • s 只包含小写英文字母。

思路

Java + 区间相交关系 + 前缀和:

第 1 步:

  • 根据题目可以想到,将一个字符串变成两个字符串,按照"中心对折"方式(后一半字符串反转),判断两字符串相等就是回文串,
  • 接着俩字符串各自有一个区间可以随便排序,即区间外部全等 + 区间内部每种字符相等即可,

第 2 步:

  • "中心对折"其实是将 queries[i] = [ai, bi, ci, di] 的 ci,di 反转,并从 0 开始

第 3 步:

  • 区间外部全等:区间内包含所有不一致的字符,
  • 区间内部每种字符相等:区间内 a-z 个数均一致,
  • 可以先求出(对应不相等字符、对应 a-z 个数)前缀和,然后求差分解决,

第 4 步:

  • 先特判俩字符串字符个数有不相等的,则一定都不能凑成,
  • 在判断区间相交关系,有三种情况
    • 区间包含,仅存大区间,仅判断区间内包含所有不一致的字符是否包含全部
    • 区间不相交,存两个区间,先判断俩区间内包含所有不一致的字符和是否包含全部,再分别判断区间内 a-z 个数均一致
    • 区间相交,先判断合并成单个区间内、包含所有不一致的字符是否包含全部,在判断合并成单个区间内、a-z 个数均一致,最后看前一个区间能重新排列的字符串1、是否均包含字符串2的前一个区间非重叠的元素

复杂度

时间复杂度:

时间复杂度: O ( 26 ∗ ( n + m ) ) O(26*(n+m)) O(26(n+m))

空间复杂度:

空间复杂度: O ( 26 ∗ n ) O(26*n) O(26n)

Code

class Solution {/*** Java + 区间相交关系 + 前缀和:** 第 1 步:* 根据题目可以想到,将一个字符串变成两个字符串,按照"中心对折"方式(后一半字符串反转),判断两字符串相等就是回文串,* 接着俩字符串各自有一个区间可以随便排序,即区间外部全等 + 区间内部每种字符相等即可,** 第 2 步:* "中心对折"其实是将 queries[i] = [ai, bi, ci, di] 的 ci,di 反转,并从 0 开始** 第 3 步:* 区间外部全等:区间内包含所有不一致的字符,* 区间内部每种字符相等:区间内 a-z 个数均一致,* 可以先求出(对应不相等字符、对应 a-z 个数)前缀和,然后求差分解决,** 第 4 步:* 先特判俩字符串字符个数有不相等的,则一定都不能凑成,* 在判断区间相交关系,有三种情况*     * 区间包含,仅存大区间,仅判断区间内包含所有不一致的字符是否包含全部*     * 区间不相交,存两个区间,先判断俩区间内包含所有不一致的字符和是否包含全部,再分别判断区间内 a-z 个数均一致*     * 区间相交,先判断合并成单个区间内、包含所有不一致的字符是否包含全部,在判断合并成单个区间内、a-z 个数均一致,*     最后看前一个区间能重新排列的字符串1、是否均包含字符串2的前一个区间非重叠的元素** 时间复杂度:O(26*(n+m)),空间复杂度:O(26*n)*/public boolean[] canMakePalindromeQueries(String s, int[][] queries) {int len = s.length();int mid = len >> 1;// "中心对折"其实是将 queries[i] = [ai, bi, ci, di] 的 ci,di 反转,并从 0 开始for (int[] querie : queries) {int temp2 = querie[2];int temp3 = querie[3];querie[2] = len + mid - 1 - temp3 - mid;querie[3] = len + mid - 1 - temp2 - mid;}// 均往后移位 1,方便计算前缀和// 对应不相等字符int[] palDiff = new int[mid + 1];// 对应 a-z 个数int[][] palWordCount1 = new int[mid + 1][26];int[][] palWordCount2 = new int[mid + 1][26];for (int i = 0; i < mid; i++) {int j = len - i - 1;if (s.charAt(i) != s.charAt(j)) {palDiff[i + 1] = 1;}palWordCount1[i + 1][s.charAt(i) - 'a']++;palWordCount2[i + 1][s.charAt(j) - 'a']++;}for (int i = 0; i < mid; i++) {palDiff[i + 1] += palDiff[i];for (int j = 0; j < 26; j++) {palWordCount1[i + 1][j] += palWordCount1[i][j];palWordCount2[i + 1][j] += palWordCount2[i][j];}}boolean[] res = new boolean[queries.length];// 特判俩字符串字符个数有不相等的,则一定都不能凑成for (int i = 0; i < 26; i++) {if (palWordCount1[mid][i] != palWordCount2[mid][i]) {return res;}}for (int i = 0; i <queries.length; i++) {int[] querie = queries[i];// 区间包含,仅存大区间,仅判断区间内包含所有不一致的字符是否包含全部if ((querie[0] <= querie[2] && querie[1] >= querie[3]) || (querie[2] <= querie[0] && querie[3] >= querie[1])) {int left = Math.min(querie[0], querie[2]);int right = Math.max(querie[1], querie[3]);if (palDiff[right + 1] - palDiff[left] == palDiff[mid]) {res[i] =true;}// 区间不相交,存两个区间,先判断俩区间内包含所有不一致的字符和是否包含全部,再分别判断区间内 a-z 个数均一致} else if (querie[1] < querie[2] || querie[3] < querie[0]) {if ((palDiff[querie[1] + 1] - palDiff[querie[0]]) + (palDiff[querie[3] + 1] - palDiff[querie[2]]) != palDiff[mid]) {continue;}boolean flag = true;for (int j = 0; j < 26; j++) {if (palWordCount1[querie[1] + 1][j] - palWordCount1[querie[0]][j] != palWordCount2[querie[1] + 1][j]  - palWordCount2[querie[0]][j]|| palWordCount1[querie[3] + 1][j] - palWordCount1[querie[2]][j] != palWordCount2[querie[3] + 1][j]  - palWordCount2[querie[2]][j] ) {flag = false;break;}}res[i] = flag;// 区间相交,先判断合并成单个区间内、包含所有不一致的字符是否包含全部,在判断合并成单个区间内、a-z 个数均一致,// 最后看前一个区间能重新排列的字符串1、是否均包含字符串2的前一个区间非重叠的元素} else {int left = Math.min(querie[0], querie[2]);int right = Math.max(querie[1], querie[3]);if (palDiff[right + 1] - palDiff[left] != palDiff[mid]) {continue;}boolean flag = true;for (int j = 0; j < 26; j++) {if (palWordCount1[right + 1][j] - palWordCount1[left][j] != palWordCount2[right + 1][j]  - palWordCount2[left][j]) {flag = false;break;}}// 0 2 1 3 形式if (querie[0] < querie[2] || querie[1] < querie[3]) {for (int j = 0; j < 26; j++) {if (palWordCount1[querie[1] + 1][j] - palWordCount1[querie[0]][j] < palWordCount2[querie[2]][j]  - palWordCount2[querie[0]][j]) {flag = false;break;}}// 2 0 3 1 形式} else {for (int j = 0; j < 26; j++) {if (palWordCount2[querie[3] + 1][j] - palWordCount2[querie[2]][j] < palWordCount1[querie[0]][j]  - palWordCount1[querie[2]][j]) {flag = false;break;}}}res[i] = flag;}}return res;}
}

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

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

相关文章

算法题Python常用内置函数、方法、技巧汇总(其五:堆/优先队列)

文章目录 优先队列相关操作堆化入堆出堆获取堆顶元素小根堆与大根堆 华为OD算法/大厂面试高频题算法练习冲刺训练 优先队列相关操作 注意&#xff0c;优先队列&#xff08;priority queue&#xff09;也叫做堆&#xff08;heap&#xff09;。谈到优先队列时&#xff0c;一般强调…

Nginx屏蔽垃圾邮件骚扰IP的方法

原文地址&#xff1a;Nginx屏蔽垃圾邮件骚扰IP的方法 本文介绍了如何下载并引入deny-ips.conf配置文件&#xff0c;以及如何定制403页面&#xff0c;避免误杀合法访问者。 最近&#xff0c;很多人都遭受到垃圾邮件的骚扰&#xff0c;让我们无法正常地观看和回复重要信息。在这种…

Python面向对象-三大特性

一 三大特性-封装 面向对象思想有三大特性&#xff1a;封装、继承、多态。 封装&#xff1a;将属性和方法放到一起做为一个整体&#xff0c;然后通过实例化对象来处理&#xff0c;这样隐藏内部实现细节&#xff0c;只需要和对象及其属性和方法交互就可以了。 为了更好的封装…

HTML5+CSS3②——图像、超链接、音频、视频

目录 图像 超链接 音频 视频 图像 作用&#xff1a;在网页中插入图片 单标签&#xff1a; 标签名&#xff1a;<img src"图片的URL"> <img src"图片的URL" alt"替换文本" title"提示文本"> 属性写在尖括号里面&#xff0c;…

【Redis-02】Redis数据结构与对象原理 -上篇

Redis本质上是一个数据结构服务器&#xff0c;使用C语言编写&#xff0c;是基于内存的一种数据结构存储系统&#xff0c;它可以用作数据库、缓存或者消息中间件。 我们经常使用的redis的数据结构有5种&#xff0c;分别是&#xff1a;string(字符串)、list(列表)、hash(哈希)、s…

多环境及SpringBoot项目部署

1、多环境 2、项目部署上线 原始前端 / 后端项目宝塔Linux容器容器平台 3、前后端联调 4、项目扩展和规划 多环境 程序员鱼皮-参考文章 本地开发&#xff1a;localhost&#xff08;127.0.0.1&#xff09; 多环境&#xff1a;指同一套项目代码在把不同的阶段需要根据实际…

将数据“0x0f“写入AT24C02再读出送P1口显示

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写入…

win10系统gpu本地部署chatglm3-6b,从0开始安装

开源地址&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 前言&#xff1a;ChatGLM2与ChatGLM3区别 ChatGLM2与ChatGLM3模型架构是完全一致的&#xff0c;ChatGLM与后继者结构不同。可见ChatGLM3相对于ChatGLM2没…

杨辉三角型打印

注&#xff1a; 利用杨辉三角形可以快速的列出牛顿二项式分解。 如&#xff1a;杨辉三角第6行值是 1 6 15 20 15 6 1 对应的二项式分解就是 ( m n ) 6 m 6 6 m 5 n 15 m 4 n 2 20 m 3 n 3 15 m 2 n 4 6 m n 5 n 6 (mn)^6m^66m^5n15m^4n^220m^3n^315m^2n^46mn^5n^6 (m…

NLP项目之语种识别

目录 1. 代码及解读2. 知识点n-grams仅保留最常见的1000个n-grams。意思是n1000 ? 1. 代码及解读 in_f open(data.csv) lines in_f.readlines() in_f.close() dataset [(line.strip()[:-3], line.strip()[-2:]) for line in lines] print(dataset[:5])[(1 december wereld…

付费进群系统源码带定位完整独立版(12月30日)再次修复首发

搭建教程 nginx1.2 php5.6–7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuku.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账号&…

2023年度个人总结

现在是北京时间2023年12月31日 下午17:13&#xff0c;再有不到7个小时就要迈入2024年。回望2023年真的是一言难尽&#xff0c;苦不堪言&#xff0c;不管是工作上还是生活中都经历了重重困难&#xff0c;肉体和精神上都备受折磨&#xff0c;特别痛苦。2023年是特别的艰辛、痛苦、…

ArkUI中自定义组件的生命周期

文章概叙 本文主要是介绍下在作为page以及component的时候的生命周期&#xff0c;以及调用API等应该在哪个生命周期使用。 书接上回 之前的博客已经结束了对底部栏的操作&#xff0c;现在开始需要关注到具体内容的对接了。 而开发的第一步&#xff0c;我们对页面的生命周期…

探索抖音详情API:塑造未来的媒体交互

一、引言 随着数字媒体的迅猛发展&#xff0c;抖音作为全球领先的短视频平台&#xff0c;其API接口为开发者提供了无尽的创新机会。了解抖音详情API的请求格式与参数&#xff0c;是每位有远见的开发者和媒体策划者的必修课。本文将深入剖析API的内在逻辑与潜力&#xff0c;为您…

Windows 产品历史

Windows 1.0&#xff5e;3.0概述 Windows 3.1及以前版本均为16位系统&#xff0c;因而不能充分利用硬件迅速发展的强大功能。同时,它们只能在MS-DOS上运行&#xff0c;必须与MS-DOS共同管理系统资源,故它们还不是独立的、完整的操作系统。1995年推出的Windows 95已摆脱MS-DOS的…

Vue懒加载深度解析:提升性能、优化用户体验的完整指南

文章目录 &#x1f333;引言&#x1f333;Vue懒加载基础&#x1f332;什么是懒加载&#xff1f;&#x1f332;组件级懒加载&#x1f332;图片懒加载 &#x1f333;懒加载的原理与优势&#x1f332;组件懒加载原理&#x1f332;图片懒加载原理&#x1f332;懒加载的优势 &#x…

最后一次纪念在泰山OFFICE的日子,明年开源量子OFFICE

今天去泰山在无锡的办公地点&#xff0c;给门卫送了一点零食表示感谢。送了之后&#xff0c;我也没进去怀旧&#xff0c;然后就去附近的南山&#x26e50;礼佛求福。 2021年的最后一天&#xff0c;公司举办了迎新活动。看了恍如隔世。我怀念泰山OFFICE&#xff0c;是因为在这里…

上海周边公路骑行路线分享,维乐带你抓住秋天的小尾巴

路线一&#xff1a;松江郊里骑行      在魔都上海&#xff0c;藏着一条自然风景适宜&#xff0c;能眺望黄浦江的美丽骑行路线。导航到华长路杨家角就能到达起点&#xff0c;一路向西&#xff0c;这里路况非常好&#xff0c;只有一条小道&#xff0c;没有汽车的障碍&#xf…

25、WEB攻防——通用漏洞SQL读写注入MYSQLMSSQLPostgreSQL

文章目录 Mysql-root高权限读写注入PostgreSQL——dba高权限读写注入Mssql-sa高权限读写注入 Access无高权限注入点——只能猜解&#xff0c;而且是暴力猜解&#xff1b; MYSQL&#xff0c;PostgreSQL&#xff0c;MSSQL(SQL server)高权限注入点——可升级读写&#xff08;文件…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南&#xff0c;介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…