题解 - 修改回文(二)(上海月赛2024.7乙组T4)

题目描述

给定一个仅由小写字母组成的字符串 s ,你可以添加一些字符(也可以不加),使其构成回文串。
请你输出在添加字符数最少的前提下,能够构成字典序最小的回文串。

输入格式

输入共一行,一个字符串 s

输出格式

输出共一行,题目所求的回文串。

数据范围

设 ∣s∣ 为字符串 s 的长度,则有:1≤∣s∣≤1000

样例

输入:

ai

输出:

aia

说明:

字符串ai至少添加一个字符构成回文,该前提下,可以构造成aia、iai,但aia的字典序更小

分析

区间dp、双指针、思维。

  1. 首先可以通过区间dp求出需要插入的字符数。

f[i][j]表示从第i个字符到第j个字符的子串变成回文所需的最少字符插入次数。

定义 f[i][j] 为将子串 s[i…j] 转化为回文串所需的最少字符数。

如果 s[i] == s[j],则 f[i][j] = f[i + 1][j - 1]
否则,f[i][j] = min(f[i + 1][j], f[i][j - 1]) + 1

  1. 然后考虑如何构造最终的答案。

可以从两端开始构造最小字典序的回文串:

初始化双指针 l 和 r,分别指向字符串的两端

初始化最终答案的左半部分为tmp,tmp初始为空

  • 如果 s[l] == s[r],则将 s[l] 加入tmp

  • 如果 s[l] != s[r],则根据 f[l + 1][r]f[l][r - 1]判断是将 s[l] 还是
    s[r] 放入tmp

    f[l + 1][r] < f[l][r - 1],说明将[l + 1][r]这一段构造成回文串的代价 小于 将f[l][r - 1]这一段构造成回文串的代价,因此我们将s[l]放入tmp。

    f[l + 1][r] > f[l][r - 1],同理我们将s[r]放入tmp。

    f[l + 1][r] = f[l][r - 1],我们将 s[l] 和 s[r] 的较小值放入tmp即可。

注意指针的移动。

  1. 生成最终答案回文串

将tmp翻转后拼接到tmp后边,即可构造出回文串。

注意,需要判断 tmp 最后添加的字符是否是中间字符,这种情况下,最后一个字符在反转部分中不应该再次出现。

例如:对于abc,最终答案应该为abcba,而不是abccba

代码

#include<bits/stdc++.h>using namespace std;const int N = 1000 + 10;char s[N];
int f[N][N];int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin >> s + 1;int n = strlen(s + 1);for(int len = 2;len <= n;len++)for(int i = 1;i + len - 1 <= n;i++){int l = i,r = i + len - 1;if(s[l] == s[r]) f[l][r] = f[l + 1][r - 1];else f[l][r] = min(f[l + 1][r],f[l][r - 1]) + 1;}string tmp;int l = 1,r = n;while(l <= r){if(s[l] == s[r]){tmp.push_back(s[l]);l++,r--;}else if(f[l + 1][r] < f[l][r - 1]){tmp.push_back(s[l]);l++;}else if(f[l + 1][r] > f[l][r - 1]){tmp.push_back(s[r]);r--;}else if(s[l] < s[r]){tmp.push_back(s[l]);l++;}else{tmp.push_back(s[r]);r--;}}string tmpp = tmp;reverse(tmpp.begin(),tmpp.end());if(l - r > 1){tmpp = tmpp.substr(1,tmpp.size() - 1);}cout << tmp + tmpp;return 0;
}

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

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

相关文章

快速幂算法

函数 pow_mod 计算 (x^y \mod \text{mod}) 的值&#xff0c;其中 (x) 是基数&#xff0c;(y) 是指数&#xff0c;(\text{mod}) 是模数。它使用的是“快速幂”算法&#xff0c;这是一种高效计算大整数幂的方法&#xff0c;并在每一步计算中都取模以防止溢出。这个算法的时间复杂…

Python seaborn美化篇-风格style

本文分享Python seaborn中通过风格style美化图形。 风格(style),用于设置the general style of the plots,例如,图中网格线是否开启、颜色、线宽等。 5.2 style设置图形通用样式 5.2.1 axes_style查看style内容 一张图的style包含的内容可通过axes_style()查看, sns…

2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛补题3、4)

题4&#xff1a;RC-u4 章鱼图的判断 分数 25 题目&#xff1a; 对于无向图 G(V,E)&#xff0c;我们将有且只有一个环的、大于 2 个顶点的无向连通图称之为章鱼图&#xff0c;因为其形状像是一个环&#xff08;身体&#xff09;带着若干个树&#xff08;触手&#xff09;&a…

QT报红色错误,实际可以编译

QT报红色错误&#xff0c;实际可以编译&#xff0c;看着难受&#xff0c;如何去掉报警 进入插件 勾选框去掉&#xff0c;然后重启QT

Java——循环控制for,while,do...while

目录 1.for循环控制 基本介绍 基本语法 流程分析 案例演示&#xff1a; 注意事项和细节说明 练习题 2.while循环控制 基本语法 流程图 案例演示1 注意事项和细节说明 案例演示2 ​3.do...while循环控制 基本语法 说明 流程图 注意事项和细节说明 练习题…

杂项运算符及运算符的优先级

文章目录 常见的杂项运算符运算符的优先级特殊运算符运算符重载运算符的结合性实际应用中的注意事项1. 空条件运算符 (Null Coalescing Operator)JavaScript 示例: 2. 范围运算符 (Range Operator)Swift 示例: 3. 模式匹配运算符 (Pattern Matching)Rust 示例: 4. 解构赋值运算…

电信运营商推销套餐涉嫌侵犯消费者权益,如何维护自身权益?

近日&#xff0c;有消费者反映某电信运营商在推荐业务时存在误导和欺骗行为&#xff0c;侵犯了消费者的合法权益。本文将分析该事件中运营商的违规行为&#xff0c;以及消费者可以采取的维权措施。 一、运营商涉嫌违规的行为 1. 误导推销&#xff0c;未充分履行告知义务 工作…

2024年获客新渠道,大数据爬虫获客:技术实现精准抓取数据资源

**2024年获客新渠道&#xff1a;大数据爬虫获客及技术实现精准抓取数据资源** ### 一、大数据爬虫获客概述 在2024年&#xff0c;随着大数据技术的不断发展和互联网的普及&#xff0c;大数据爬虫获客已经成为企业获取客户信息、实现精准营销的重要渠道。爬虫技术通过自动化程…

C# 12 新增功能实操!

前言 今天咱们一起来探索并实践 C# 12 引入的全新功能&#xff01; C#/.NET该如何自学入门&#xff1f; 注意&#xff1a;使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。 主构造函数 主构造函数允许你直接在类定义中声明构造函数参数&#xff0c;…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

Pytorch笔记1

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 整体框架如下 目录 gpu加速数据数据结构张量TensorVariable 预处理数据增强 模型构建模块组织复杂网络初始化网络参数定义网络层 损失函数创建损失函数设置损失函数超参数选择损失函数 优化器管理模型参数管理…

“八股文”:程序员的福音还是梦魇?

——一场关于面试题的“代码战争” 在程序员的世界里&#xff0c;“八股文”这个词儿可谓是“如雷贯耳”。不&#xff0c;咱们可不是说古代科举考试中的那种八股文&#xff0c;而是指程序员面试中的那些固定套路的题目。如今&#xff0c;各大中小企业在招聘程序员时&#xff0…

无为自然与机巧器械

无为自然与机巧器械 一天&#xff0c;庄周与蔺且正在整理这些天来为求道之人回答的谈话录&#xff0c;又来了一位士。这位士提了这样一个问题&#xff1a;   “庄周先生&#xff0c;您的学说以无为自然为主&#xff0c;那么&#xff0c;您是不是主张将一切人所创造出来的机巧…

vite解决前端跨域步骤

Vite 解决跨域问题的原理主要是通过其内置的开发服务器功能实现的&#xff0c;具体来说&#xff0c;是通过 HTTP 代理&#xff08;HTTP Proxy&#xff09;机制。在开发环境中&#xff0c;Vite 服务器可以配置为一个代理服务器&#xff0c;将前端应用发出的请求转发到实际的后端…

Overlay网络

Overlay 介绍 Overlay网络是将已有的物理网络&#xff08;Underlay网络&#xff09;作为基础&#xff0c;在其上建立叠加的逻辑网络&#xff0c;实现网络资源的虚拟化。 传统网络带来了以下一些问题&#xff1a; ● 虚拟机规模受 网络规格限制在传统二层网络环境下&#xff0…

ConcurrentHashMap 和 Hashtable的区别

ConcurrentHashMap 和 Hashtable 的区别&#xff1a; 1. 线程安全机制&#xff1a; - ConcurrentHashMap 采用分段锁&#xff08;Segment&#xff09;的机制实现线程安全。它将数据分成多个段&#xff08;Segment&#xff09;&#xff0c;每个段都有一个独立的锁。这样&#xf…

暑期计划总结

每日安排 早上用来学习新知识 中午用于巩固 晚上再尝试难一点的 注意背单词&#xff0c;题目老是看不明白 重心放在图论 目标 cf立志上1600

泰迪智能科技大数据实验室——陕西省高校合作成功案例

近年来&#xff0c;陕西省紧跟国家大数据发展战略&#xff0c;积极推进大数据产业发展。在政策扶持、产业布局、技术创新等方面取得显著成效。泰迪智能科技大数据实验室立足陕西&#xff0c;携手西安邮电大学、西安财经大学、陕西科技大学镐京学院、宝鸡文理学院、渭南师范学院…

使用Selenium爬虫批量下载AlphaFold数据库中的PDB文件

注意&#xff1a;本方法使用了python&#xff0c;下载速度一般&#xff0c;如果需要更快的大批量下载可以考虑使用其他方法&#xff0c;例如FTP Alphafold数据库其实提供了许多物种的蛋白质组&#xff1a; AlphaFold Protein Structure Database 但是如果你搜索的物种不在这个…

【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 前言 上节课完成了里程计数据与坐标变换发布&#xff0c;但是还没有测试&#xff0c;本节进行测试&#xff0c;测试之前需要知道一件事&#xff0c;上位机也就是开发板一般不做可视化用&#xff0c;因…