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

news2025/1/22 6:20:50

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 += 1
            r -= 1
        return s

    # 尝试直接将 s 构造成回文字符串
    t = build(s)
    if t < s:  # 如果构造的回文字符串字典序小于原字符串
        ans = t
    else:
        # 如果直接构造的回文不满足字典序小于 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'

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

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

相关文章

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

数据库-多表关系

项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构。由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系。 多表关系&#xff1a; 一对多 ( 多对一 ) 一对一 多对多 多表关系 …

【STM32G4xx的CAN驱动记录】

STM32G4xx的CAN驱动记录 CAN说明CAN的波特率计算数据测试总结 本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法&#xff0c;CAN总线波特率500Kbps&#xff0c;采样点要求80%附近。 注意CAN总线同步段的时间&#xff01;&#xff01;&#xff01; …

Cyber Security 101-Security Solutions-Vulnerability Scanner Overview(漏洞扫描程序概述)

了解漏洞扫描程序及其在实际场景中的工作原理。 任务1&#xff1a;什么是漏洞? 想象一下你住在一个小而可爱的房子里。有一天&#xff0c;你注意到 你的屋顶有很多小洞。如果不处理&#xff0c;这些小孔 可能会导致重大问题。下雨时&#xff0c;水会流过来 这些泄漏并损坏您…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

【经验分享】ARM Linux-RT内核实时系统性能评估工具

【经验分享】ARM Linux-RT内核实时系统性能评估工具 前言下载和编译方法常用工具介绍总结 前言 最近在研究Linux-RT实时系统&#xff0c;介绍下常用的实时系统的性能评估工具。 下载和编译方法 用git下载 git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.…

C++ ——— 模拟实现 vector 类

目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…

02内存结构篇(D4_JVM内存分配机制)

目录 一、对象的创建 1. 类加载检查 2. 分配内存 3. 初始化零值 4. 设置对象头 32位对象头 64位对象头 5. 执行方法 二、对象大小与指针压缩 三、对象内存分配 1. 对象内存分配流程图 2. 对象栈上分配 3.3 对象在Eden区分配 3.4 大对象直接进入老年代 3.5 长期存…

异步 进程 Promise规范及应用

异步 两个或多个事件不同时存在或发生&#xff0c;区别于同步&#xff0c;同步是顺序执行从上到下&#xff0c;而异步不需要顺序执行&#xff0c;且不依赖于前面的事情是否已完成。 举例&#xff1a; //异步执行 let count 1; let timer setTimeout(function () {count…

C#树图显示目录下所有文件以及文件大小

C#树图显示目录下所有文件以及文件大小 我们在打开某个目录属性时,可以查看到有大小信息.如下图 而一个目录(文件夹)System.IO.Directory是没有FileSize或者Length属性的. 目录(文件夹)的大小是指该目录下所有子目录和所有文件大小的累加,按字节为单位. 新建窗体应用程序Get…

力扣707题——设计链表

#题目 从零开始设计链表&#xff0c;我们拆分成两次任务&#xff0c;今天先看1 ,2 ,4 #代码

机器学习09-Pytorch功能拆解

机器学习09-Pytorch功能拆解 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…

天津市开通首个万兆宽带:1秒钟下载1GB文件

快科技1月21日消息&#xff0c;华为光网宣布&#xff0c;天津联通携手华为&#xff0c;日前成功为天津市北辰区柴楼金园小区部署了天津市首个万兆宽带网络。 在现场测速环节中&#xff0c;该万兆宽带网络展现出了惊人的速度——高达9429Mbps的下载速率&#xff0c;几乎跑满带宽…

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

CSDN年度回顾:技术征途上的坚实步伐

嘿&#xff0c;时光过得可真快呀&#xff0c;就像那匹跑得飞快的白马&#xff0c;嗖的一下&#xff0c;2024 年的日历就这么悄无声息地翻到了最后一页。这会儿我回头看看在 CSDN 上度过的这一年&#xff0c;心里那叫一个感慨万千&#xff0c;满满的都是喜悦&#xff0c;就像心里…

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误 在使用 PostgreSQL 数据库并尝试创建 TimescaleDB 扩展时&#xff0c;你可能会遇到一些棘手的错误。今天&#xff0c;我们就来探讨一个常见的错误信息及相应的解决方法&#xff1a; CREATE EXTENSION IF NOT EXISTS tim…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…