完美的代价

题目:

* 题目:
* 回文串,是一种特殊的字符串,它从左往右和从右往左读是一样的。
* 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变为完美的回文回文串。
* 例如:mamad
* 第一次交换:mamda
* 第二次交换:madma
* 第三次交换:madam

* 输入格式:
* 第一行输入整数n ,表示字符串的长度(n <=8000 )
* 第二行输入字符串,长度为n,只包含小写字母

* 输出格式:
* 如果可能,输出最少次数
* 否则,输出Impossible

* 样列输入
* 5
* mamad
* 样例输出
* 3

解题思路:
  • 输入
  • 处理数据
  • 输出
输入:
Scanner sc = new Scanner(System.in);int len = sc.nextInt();String str = sc.next();
处理数据:(多读题,解题的关键)
关键词提取:

回文串:

第一个与倒数第一一样

第二个与倒数第二一样

思考:

什么是回文串?

怎么判断它是回文串

结论:

(1)根据回文串的定义:我们需要俩个指针,一个从左往右,一个从右往左

(2)根据第一点,我们可以定义一个指针从左往右遍历,一个指针从右往左遍历找到相同的就将它丢到最后,长度--

如图当我们找到m后将m移动到最后,m不可能再次被移动【回文串特性:当前数据的第一个,与当前数据的最后一个一样】

(3)第一个与最后一个位置确定,那就可以缩短数组的长度

如果没有找到呢?

按照刚才的思路如果没有找到,我们不管它会出现什么样的情况?

我们把c假装看不见跳过对后面的数据排列,让它除掉c就是回文数,最后只需要移动c即可;


思路总结:

这题最重要是思路是将左右移动的数据:转换为只移动一个方向;我们每一次假设左边得到的数据是已经排好序的,从当前左边的数据中确定当前最后位置的数据;

在这个过程中,我们对数组的长度减少,减少交换的可能次数,保证数据只从一个方向移动,所以可以作为最少移动次数;

1、判断数据是否可以构成回文串

        //判断是否为可成为回文串//将数据类型转换为数组减少charAt的调用char[] arr = str.toCharArray();//1、判断长度是否符合if (len != arr.length) {System.out.println("Impossible1");return;}//2、判断是否可以构成回文串int[] num = new int[26];for (int i = 0; i < arr.length; i++) {int k = arr[i] - 97;num[k]++;}int ans = 0;for (int i : num) {if (i % 2 == 1) {ans++;}}if (ans > 1) {System.out.println("Impossible2");return;}

2、构建回文串,记录回文数据

     ans = 0;//记录移动次数int end = len - 1;for (int i = 0; i < (len+1) / 2; i++) {int j;for (j = end; j > i; j--) {if (arr[i] == arr[j]) {while (j < end) {char tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;j++;ans++;}
《《  长度--  》》end--;break;}}if (i == j) {ans += (len-1) / 2 - i;}}
输出:ans记录次数
System.out.println(ans);

完整代码:《因为懒,所以没有使用方法》

package LanQiao.text;import java.util.Scanner;/*** 题目:* 回文串,是一种特殊的字符串,它从左往右和从右往左读是一样的。* 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变为完美的回文回文串。* 例如:mamad* 第一次交换:mamda* 第二次交换:madma* 第三次交换:madam* <p>* 输入格式:* 第一行输入整数n ,表示字符串的长度(n <=8000 )* 第二行输入字符串,长度为n,只包含小写字母* <p>* 输出格式:* 如果可能,输出最少次数* 否则,输出Impossible* <p>* 样列输入* 5* mamad* 样例输出* 3*/
public class 回文串 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int len = sc.nextInt();String str = sc.next();//判断是否为可成为回文串//将数据类型转换为数组减少charAt的调用char[] arr = str.toCharArray();//1、判断长度是否符合if (len != arr.length) {System.out.println("Impossible1");return;}//2、判断是否可以构成回文串int[] num = new int[26];for (int i = 0; i < arr.length; i++) {int k = arr[i] - 97;num[k]++;}int ans = 0;for (int i : num) {if (i % 2 == 1) {ans++;}}if (ans > 1) {System.out.println("Impossible2");return;}ans = 0;int end = len - 1;for (int i = 0; i < (len+1) / 2; i++) {int j;for (j = end; j > i; j--) {if (arr[i] == arr[j]) {while (j < end) {char tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;j++;ans++;}end--;break;}}if (i == j) {ans += (len-1) / 2 - i;}}System.out.println(ans);}
}

各位小伙伴有没有画图工具推荐~,excle还是不顺手,非常感谢!

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

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

相关文章

音视频技术开发周刊 | 317

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 MIT惊人再证大语言模型是世界模型&#xff01;LLM能分清真理和谎言&#xff0c;还能被人类洗脑 MIT等学者的「世界模型」第二弹来了&#xff01;这次&#xff0c;他们证明…

275. H 指数 II

275. H 指数 II 难度: 中等 来源: 每日一题 2023.10.30 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数&#xff0c;citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。 h 指数的定义&#xff1a;h 代表“高…

“探索Linux世界:从CentOS安装到常见命令使用“

目录 引言一、安装CentOS二、Linux的常见命令文件夹和目录操作命令文件编辑命令vi或vim编辑器命令模式编辑模式末行模式 总结 引言 在计算机领域&#xff0c;Linux作为一种强大而灵活的操作系统&#xff0c;在服务器、嵌入式设备和个人电脑等领域广泛应用。本文将引导您了解并…

Linux基础环境开发工具的使用(yum,vim,gcc,g++)

Linux基础环境开发工具的使用[yum,vim,gcc,g] 一.yum1.yum的快速入门1.yum安装软件2.yum卸载软件 2.yum的生态环境1.操作系统的分化2.四个问题1.服务器是谁提供的呢?2.服务器上的软件是谁提供的呢?3.为什么要提供呢?4.yum是如何得知目标服务器的地址和下载链接呢?5.软件源 …

基于单片机的空气质量检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、主要内容二、系统方案设计2.1 系统方案设计2.2 主控制器模块选择 三、 系统软件设计4.1 程序结构分析4.2系统程序…

小红书平台用户数据分析与可视化

管理器、网页下载器、网页解析器、输出管理器这四个模块去搭建一个爬虫框架&#xff0c;将爬虫流程统一化&#xff0c;将通用的功能进行抽象&#xff0c;减少重复工作。要求实现的爬虫框架可以进行分布式爬取&#xff0c;解决爬虫的统一调度和统一去重&#xff0c;以及存储问题…

[激光原理与应用-72]:PLC架构与工作原理

目录 一、PLC简介 1.1 概述 1.2 基本组成 1.3 常见的PLC品牌比较 二、PLC程序执行原理 2.1 PLC有操作系统吗&#xff1f; 2.2 PLC程序执行 2.3 PLC编程语言 2.4 PLC编程过程 三、PLC编程工具 3.1 编程工具 四、PLC与工控机协同 4.1 PLC需要配置工控机吗&#xff1…

SpringBoot / Vue 对SSE的基本使用

一、SSE是什么&#xff1f; SSE技术是基于单工通信模式&#xff0c;只是单纯的客户端向服务端发送请求&#xff0c;服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放&#xff0c;等数据更新的时候才返回给客户端&#xff0c;当客户端接收到消息后&#xff0c;再…

postman使用POST,却收到的是GET请求

现象&#xff1a; 可以看到我们postman发出的确实是post请求&#xff0c;message却报错这个接口不支持get请求&#xff0c;说明服务器实际上收到的是一个get请求。 产生原因分析 如果我们访问的是线上的接口&#xff0c;线上的nginx一般都会对http访问做一个302重定向&#xf…

生成的二维码如何解析出原来的地址?

生成的二维码如何解析出原来的地址&#xff1f; 随着移动互联网的发展&#xff0c;二维码作为一种快速获取信息的方式&#xff0c;在我们的生活中越来越常见。而PHP作为Web语言之一&#xff0c;也有着二维码解码的功能。 PHP中有着众多的二维码解码库&#xff0c;例如&#x…

k8s 集群部署

目录 1. 集群环境初始化 2. 所有节点安装kubeadm 3. 拉取集群所需镜像 4. 集群初始化 5. 安装flannel网络插件 6. 扩容节点 7. 设置kubectl命令补齐 官网&#xff1a; https://v1-23.docs.kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ …

git的使用——如何创建.gitignore文件,排除target、.idea文件夹的提交

前言 git作为开发人员必备的技能&#xff0c;需要熟练掌握&#xff0c;本篇博客记录一些git使用的场景&#xff0c;结合具体问题进行git使用的记录。以gitee的使用为例。 本篇博客介绍如何创建.gitignore文件&#xff0c;排除一些文件夹的提交&#xff0c;比如排除target、.i…

c++拷贝构造与赋值运算符重载

目录 目录&#xff1a; 1&#xff1a;拷贝构造 2&#xff1a;赋值运算符重载 前言&#xff1a;在上一章我们已经学习过了&#xff0c;构造与析构这两个默认成员函数了&#xff0c;接下来让我们一起来学习另外两个重要的默认成员函数。 首先让我们来讲一下默认成员函数这个概念…

【ARM Trace32(劳特巴赫) 使用介绍 2 -- Trace32 cmm 脚本基本语法及常用命令】

文章目录 Trace32 CMM 概述1.1 Trace32 系统命令 SYStem1.1.1 Trace32 SYStem.CONFIG1.1.2 SYStem.MemAccess1.1.3 SYStem.Mode1.1.3.1 TRST-Resets the JTAG TAP controller and the CPU internal debug logic1.1.3.2 SRST- Resets the CPU core and peripherals 1.2 Trace32 …

Azure - 自动化机器学习AutoML Azure使用详解

目录 一、AutoML是如何工作的&#xff1f;二、何时考虑AutoML&#xff1f;三、AutoML助力训练与集成过程四、实战案例五、总结 自动化机器学习&#xff0c;简称为AutoML&#xff0c;旨在将机器学习模型的开发中繁琐且重复的任务自动化。这使得数据科学家、分析师以及开发人员能…

ThinkPad电脑HDMI接口失灵如何解决?

ThinkPad电脑HDMI接口失灵如何解决&#xff1f; 如果平时正常使用的外接显示器&#xff0c;某天突然无法使用了&#xff0c;重新插拔依然无信号的话&#xff0c;可以打开系统的设备管理器&#xff08;快捷键winx&#xff09;&#xff0c;首先看一下监视器的识别情况&#xff0c…

Istio 实战

文章目录 Istio流量管理分享会【1】什么是istio?【2】istio 可以干什么?【3】业务中的痛点?【4】istio 高级流量管理5.1 istio 组件介绍与原理5.2 sidercar何时注入?如何控制是否注入?5.3 查看sidecar 容器插入的容器中的iptablesDestination RuleVirtual ServiceGateways…

Camtasia Mac 2023版怎么给视频加字幕

在视频制作过程中&#xff0c;字幕和马赛克是两项非常常用的编辑功能&#xff0c;添加字幕可以提高观众的观看体验&#xff0c;添加马赛克可以保护视频创作者不想公开的画面内容。Camtasia作为一款知名的视频制作软件&#xff0c;在具备基本的录制和视频编辑功能的同时&#xf…

win10安装spark

一、进入spark下载页面 连接 Downloads | Apache Spark 二、解压下载后的.tgz文件 直接解压即可 三、运行 运行bin目录下的 spark-shell.cmd 提示 Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.hom…