完美的代价

题目:

* 题目:
* 回文串,是一种特殊的字符串,它从左往右和从右往左读是一样的。
* 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变为完美的回文回文串。
* 例如: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,一经查实,立即删除!

相关文章

微软Azure文本转音频,保存成MP3文件【代码python3】

标签&#xff1a; 文本转音频并保存mp3文件&#xff1b; 微软Azure&#xff1b; 微软Azure可以将文本转音频&#xff0c;并保存mp3文件&#xff0c;直接上代码 代码格式&#xff1a;python 3 import os import azure.cognitiveservices.speech as speechsdk# This example re…

叛乱沙漠风暴server安装 ubuntu 22.04

最新版沙暴已经不支持centos了&#xff0c;还是使用ubuntu比较顺利 官方文档&#xff1a; https://sandstorm-support.newworldinteractive.com/hc/en-us/articles/360049211072-Server-Admin-Guide // 安装steamcmd依赖 sudo add-apt-repository multiverse sudo apt inst…

音视频技术开发周刊 | 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;在服务器、嵌入式设备和个人电脑等领域广泛应用。本文将引导您了解并…

git cherry-pick命令详细用法

git cherry-pick命令详细用法 1.需求背景2.git cherry-pick介绍3.演示操作4.cherry-pick 支持一次转移多个提交5.代码冲突 1.需求背景 需要在某个稳定版本上&#xff0c;添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令&#xff0c;将这个功能相关的 commit 提…

unboundlocalerror: local variable ‘××ב referenced before assignment

发现我的代码 if self.flag valid:us self.user_valid_list[idx] elif self.flag test:us self.user_test_list[idx]info sample(us)如果我的flag不是train和valid中的值&#xff0c;那么就会出现问题&#xff0c;因此再加上一个else处理这种情况 if self.flag valid:u…

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;做个总结。 比较浅显的一些记录&#xff0c;第一次的经验之谈&#xff0c;适合首次参加可能容易遇到的问题 文章目录 平台代码tips整理 加载权重文件autopel下载上传 平台 使用的autodl平台 下载大…

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

欢迎大家点赞、收藏、关注、评论啦 &#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;再…

MATLAB算法实战应用案例精讲-【图像处理】相机标定(补充篇)

目录 前言 知识储备 摄像头基础知识 一、摄像头结构和工作原理 二、相关参

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…

2023前端面试整理

1. 介绍一下最近参与的项目,负责那些业务,在开发过程中遇到过问题吗&#xff1f;最后是咋样处理的&#xff1f; 之前负责过大小十几个项目&#xff0c;负责过浙里办的整套上架流程&#xff0c;负责过数据大屏统计&#xff0c;后台管理系统文书生成表单生成等&#xff0c;浙政钉…