当前位置: 首页 > news >正文

37.构造回文字符串问题|Marscode AI刷题

1.题目

问题描述

小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t,并且这个字符串需要满足以下几个条件:

  1. t 由小写字母组成,且长度与 s 相同。
  2. t 是回文字符串,即从左到右与从右到左读取相同。
  3. t 的字典序要小于 s,并且在所有符合条件的字符串中字典序尽可能大。

小C想知道是否能构造出这样的字符串 t,输出这样的t。如果无法构造满足条件的字符串,则输出 -1


测试样例

样例1:

输入:s = "abc"

输出:'aba'

样例2:

输入:s = "cba"

输出:'cac'

样例3:

输入:s = "aaa"

输出:'-1'

2.思路

  • 构造回文字符串
    • 首先,我们需要构造一个字典序最大的回文字符串 t。回文字符串的特点是从左到右和从右到左相同。因此,我们可以通过复制字符串的一半来构造回文字符串,保证回文性质。
  • 判断构造的回文是否满足条件
    • 构造的回文字符串 t 字典序应该小于原始字符串 s,如果满足这个条件,就可以直接返回 t
  • 调整字典序
    • 如果通过构造回文字符串得到的 t 字典序不满足 t < s,则需要从回文的中间位置开始尝试逐步减小字典序。
    • 从回文的中心开始,向左逐步调整字符,使得它们比原本的字符小,从而保证字典序尽可能大,但依然小于 s
  • 返回结果
    • 如果能够找到符合条件的回文字符串 t,则返回它;如果无法调整使得字典序小于 s,则返回 1

3.代码

def solution(s: str) -> str:# 将输入字符串转为列表方便操作s = list(s)n = len(s)# 定义一个函数,用于将字符串调整为回文字符串def build(t):s = t.copy()  # 复制 t,避免修改原始列表l, r = 0, n - 1  # 定义双指针,左指针从0开始,右指针从n-1开始# 使用双指针构造回文while l < r:s[r] = s[l]  # 将左侧字符赋值给右侧l += 1r -= 1return s# 尝试直接将 s 构造成回文字符串t = build(s)if t < s:  # 如果构造的回文字符串字典序小于原字符串ans = telse:# 如果直接构造的回文不满足字典序小于 s 的条件# 从回文中心开始尝试减小字典序i = (n - 1) >> 1  # 确定中间位置,向左遍历while i >= 0:if s[i] == 'a':  # 如果当前字符为 'a's[i] = 'z'  # 将其变为 'z'else:s[i] = chr(ord(s[i]) - 1)  # 将当前字符减小一个字母break  # 减小成功后退出循环i -= 1  # 向左移动指针if i == -1:  # 如果遍历完成仍无法减小字典序ans = ["-1"]  # 无法构造符合条件的字符串else:# 成功减小字典序后,重新构造回文ans = build(s)return "".join(ans)  # 返回最终结果,将列表转为字符串# 测试用例
if __name__ == '__main__':# 测试样例1,输入 "abc",期望输出 "aba"print(solution(s = "abc") == 'aba')  # 输出 True 表示通过测试# 测试样例2,输入 "cba",期望输出 "cac"print(solution(s = "cba") == 'cac')  # 输出 True 表示通过测试# 测试样例3,输入 "aaa",期望输出 "-1"print(solution(s = "aaa") == '-1')  # 输出 True 表示通过测试
  • i = (n - 1) >> 1

在代码中,i = (n - 1) >> 1 是一种计算字符串中间位置的常见方式,其中:

解释

  1. 位运算>> 1 表示右移一位,即将一个数除以 2,向下取整。

    例如:

    • 5>>1=25 >> 1 = 25>>1=2 (整数除法结果)。
    • 4>>1=24 >> 1 = 24>>1=2。
  2. 表达式含义(n - 1) >> 1 计算了字符串 sss 的中心位置的索引

    • n−1n - 1n−1:字符串的最大索引位置。
    • 右移一位相当于除以 2,得到中心索引位置。
    • 这是一个向左偏的中心索引,适用于在字符串中以双指针的方式从中心向两边遍历。
  • 为什么’a’要变成’z’? 如果字符已经是 'a',你不能再减小它,因为 'a' 是字母表中的最小字符。这将意味着要将前一位字母减小一位,为了保证t在所有符合条件的字符串中字典序尽可能大,所以将’a'要变成’z'

相关文章:

37.构造回文字符串问题|Marscode AI刷题

1.题目 问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t&#xff0c;并且这个字符串需要满足以下几个条件&#xff1a; t 由小写字母组成&#xff0c;且长度与 s 相同。t 是回文字符串&#xff0c;即从左到右与从右到左读取相同。t 的字典序要小…...

ssm-mybatisPlus学习笔记

注意&#xff01;mybatisPlus只能够进行单表操作&#xff0c;其他的仍需要mybatis 1.快速入门 编写启动类 MapperScan("com.atguigu.mapper") SpringBootApplication public class MainApplication {public static void main(String[] args) {SpringApplication.r…...

【算法学习笔记】35:扩展欧几里得算法求解线性同余方程

线性同余方程问题 线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m)&#xff0c;给定 a a a、 b b b和 m m m&#xff0c;找到一个整数 x x x使得该方程成立&#xff0c;即使得 a x m o d m b ax~mod~mb ax mod mb&#xff0c;随便返回任何一个…...

线性规划:机器学习中的优化利器

一、线性规划的基本概念 线性规划&#xff08;Linear Programming, LP&#xff09;是运筹学中数学规划的一个重要分支&#xff0c;用于在一组线性不等式的约束条件下&#xff0c;找到线性目标函数的最大值或最小值。其问题可以表述为&#xff1a; 在一组线性约束条件 s.t.&am…...

Ubuntu开发中的问题

1.退出anaconda指令&#xff1a;conda deactivate 2.Linux系列&#xff1a;一打开终端就默认进入conda的base环境&#xff0c;取消方法 在终端输入conda config --show&#xff0c;会显示所有的配置信息,然后利用conda config --set来修改此配置&#xff1a; conda config --se…...

MAC 地址转换为标准大写格式

// ConvertToStandardMac 将 MAC 地址转换为标准格式&#xff0c;确保每个字节都是两位&#xff0c;并且字母是大写的 func ConvertToStandardMac(mac string) (string, error) { // 分割 MAC 地址的每一部分 parts : strings.Split(mac, ":") // 确保每部分是两…...

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…...

深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能

在当下互联网技术飞速发展的浪潮中&#xff0c;Nginx 凭借其轻量级、高性能的特性&#xff0c;在 Web 服务器和反向代理服务器领域脱颖而出&#xff0c;成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源&#xff0c;在负载均衡、反向代理等方面也表现出色。然而…...

(01)搭建开发环境

1.安装虚拟机软件 VMware Workstation Pro 17 2.虚拟机安装ubuntu20.4系统 3.安装VMtools工具 4.安装vim编辑器 sudo apt install vim 4.安装SSH服务 选择下载源为&#xff1a;http://mirrors.aliyun.com/ubuntu在线安装&#xff1a;sudo apt-get install openssh-serv…...

Win11桌面右键刷新选项在二级界面的修正方法

win10已经被弃用了&#xff0c;现在的win11在桌面右键时&#xff0c;“刷新”按钮在二级界面。除此以外&#xff0c;在资源管理器中浏览文件的时候&#xff0c;很多其他选项也都被放在了二级界面&#xff0c;非常不方便。接下来介绍一个把右键菜单栏中的所有选项都显示在一级界…...

配电室防静电地板通常用哪种

配电室是指带有低压负荷的室内配电场所&#xff0c;包含变压器、配电柜、开关设备等&#xff0c;主要为低压用户配送电能。为防止设备故障、避免火灾爆炸、保护人员安全等均会安装防静电地板。那么配电室防静电地板通常用哪种&#xff1f; 一、全钢防静电地板 1. 全钢三聚氰胺…...

【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评

标题中的“最新重庆市乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移最新”指的是一个地理信息系统&#xff08;GIS&#xff09;的数据集&#xff0c;特别设计用于ArcGIS软件。这个数据集包含了重庆市所有乡镇的边界信息&#xff0c;以Shapefile&#xff08;.shp…...

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…...

Windows电脑桌面记录日程安排的提醒软件

在快节奏的现代生活中&#xff0c;工作效率成为了衡量个人能力的重要标准之一。然而&#xff0c;日常办公中常常会遇到各种琐事和任务&#xff0c;如果没有合理安排日程&#xff0c;很容易陷入混乱&#xff0c;导致效率低下。因此&#xff0c;做好日程安排对于日常工作至关重要…...

TiDB与Oracle:数据库之争,谁能更胜一筹?

TiDB与Oracle&#xff1a;数据库之争&#xff0c;谁能更胜一筹&#xff1f; 最近有很多朋友在讨论数据库的选择问题&#xff0c;尤其是在面对大数据、分布式系统时。作为两款在企业级数据库中非常受欢迎的产品&#xff0c;TiDB和Oracle常常被拿来对比。TiDB 是一款开源分布式数…...

USART_串口通讯中断案例(HAL库实现)

引言 本次&#xff0c;继续对前面寄存器实现的串口通讯中断案例使用HAL库进行二次实现&#xff0c;因此这里会省略一些重复内容&#xff0c;如果大家不清楚的话请参考下面链接&#xff1a;USART_串口通讯中断案例&#xff08;一&#xff09;&#xff08;寄存器实现&#xff09;…...

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…...

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)

一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念&#xff0c;实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 &#xff08;Deferred shading&#xff09;技术。 按照本文代码实现后&#xff0c;可以实现以下…...

linux-NFS网络共享存储服务配置

1.NFS服务原理 NFS会经常用到&#xff0c;用于在网络上共享存储&#xff0c;这样讲&#xff0c;你对NFS可能不太了解&#xff0c;举一个例子&#xff0c; 加入有三台机器A,B,C&#xff0c;它们需要访问同一个目录&#xff0c;目录中都是图片&#xff0c;传统的做法是把这些 图…...

w-form-select.vue(自定义下拉框组件)

文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的&#xff0c;我们来详细解释 w-form-select.vue 组件中每个属性的含义&#xff0c;并用表格列出它们是否与后端字段直接相关&#xff1a; 属性解释表格&…...

DMA-330地址空间限制与扩展方案解析

1. DMA-330地址空间限制解析DMA-330作为Arm CoreLink系列中的直接内存访问控制器&#xff0c;其物理寻址能力直接由AxADDR信号宽度决定。这个32位地址总线宽度意味着它原生仅支持4GB&#xff08;2^32字节&#xff09;的物理地址空间访问。在实际嵌入式系统设计中&#xff0c;这…...

为Alchitry Au FPGA开发板外接JTAG接口的完整指南

1. 项目概述与核心价值如果你正在使用基于Xilinx Artix-7 FPGA的Alchitry Au或Au开发板&#xff0c;并且已经厌倦了每次调试或烧录都要依赖板载的USB-JTAG桥接芯片&#xff0c;或者你的项目已经将板载USB接口挪作他用&#xff0c;那么为你的开发板外接一个独立的JTAG调试器&…...

雪球网md5__1038参数逆向解析与Node.js复现

1. 这不是“破解”&#xff0c;而是对前端加密逻辑的常规逆向还原你打开雪球网任意一只股票详情页&#xff0c;F12 打开开发者工具&#xff0c;切到 Network 面板&#xff0c;刷新页面——很快就能在 XHR 请求里捕获到类似这样的接口&#xff1a;https://xueqiu.com/stock/cube…...

Vulnhub-DC-1

1.信息收集 使用工具nmap扫描主机端口 这是Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成 Web指纹扫描 发现是&#xff1a;drupal…...

航空航天为什么离不开高强镁合金?国产替代到哪一步了

飞机每减重一千克&#xff0c;全年大约节省四千两百美元的燃油费用——这是航空工程师熟悉的经验值。在商业航空领域&#xff0c;这个数字还只是财务账&#xff1b;在战斗机、导弹和卫星的世界里&#xff0c;减重的收益被换算成更远的航程、更大的载荷、更高的机动性&#xff0…...

基于IRS2092的200W D类功放设计:从PWM原理到保护电路实战

1. 项目概述与核心思路折腾音响功放&#xff0c;从经典的AB类玩到D类&#xff0c;感觉就像是从燃油车换到了电动车&#xff0c;动力响应和效率完全是两个维度。这次要聊的这块“200W Class-D Audio Power Amplifier [150115]”单板功放&#xff0c;就是一个非常典型的D类功放设…...

从模糊到电影级景深:Midjourney + Topaz Gigapixel联调方案(含LUT预设包+PSD分层模板)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;从模糊到电影级景深&#xff1a;Midjourney Topaz Gigapixel联调方案&#xff08;含LUT预设包PSD分层模板&#xff09; 当Midjourney生成的图像存在主体边缘柔化、背景层次缺失或分辨率不足等问题时&#xf…...

在数据预处理与分析流水线中集成大模型API进行智能标注与摘要

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在数据预处理与分析流水线中集成大模型API进行智能标注与摘要 对于数据工程师而言&#xff0c;处理海量非结构化文本数据是一项常见…...

解决claude code频繁封号与token不足的taotoken接入方案

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 解决Claude Code频繁封号与Token不足的Taotoken接入方案 1. 问题背景&#xff1a;Claude Code用户面临的挑战 对于依赖Claude Cod…...

别再手动改代码了!用Vivado的VIO IP核实时调试你的FPGA设计(附UART实例)

实时交互式FPGA调试革命&#xff1a;Vivado VIO核的UART实战指南 调试FPGA设计时&#xff0c;你是否经历过这样的痛苦循环&#xff1a;修改一行代码→全编译→下载比特流→测试→发现问题→再修改...这种"石器时代"的工作流正在吞噬工程师的创造力。Xilinx Vivado中的…...