完美的代价

news2024/9/22 15:44:46
题目:

* 题目:
* 回文串,是一种特殊的字符串,它从左往右和从右往左读是一样的。
* 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变为完美的回文回文串。
* 例如: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.coloradmin.cn/o/1152981.html

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

相关文章

新风机如何联动?

数据中心的运行会产生大量的热量&#xff0c;因为其中包含了大量的服务器、存储设备以及网络设备等&#xff0c;它们需要消耗大量的电力来进行计算和数据处理。为了保证这些设备运行的稳定性和性能&#xff0c;数据中心必须维持适宜的温度和湿度。 新风系统可以在数据中心中起到…

centos7简易安装mysql8

下载包&#xff1a;wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm 更新rpm缓存&#xff1a;sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm 安装mysql-server&#xff1a;sudo yum install mysql-community-server --nogpgcheck 强…

使用内网穿透工具进行支付宝沙箱环境支付的SDK接口远程测试

Java支付宝沙箱环境支付&#xff0c;SDK接口远程调试【内网穿透】 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址&#xff1a;https://doc.open.alipay.com…

el-tabel表格加个多选框

<template><div><el-checkbox v-model"checked" :disabled"checkedDis" change"onAllSelectChange">多选框</el-checkbox>点击多选框&#xff0c;禁用列表复选框<el-table ref"multipleTable" :data"…

Google Play PolicyBytes 政策更新中文视频 | 2023 年 10 月

Google Play 持续帮助开发者开启成功出海之旅&#xff0c;为用户提供安全优质的应用。也感谢大家与我们携手合作&#xff0c;继续努力将 Google Play 打造为一个安全可信赖的平台。欢迎您观看 Google Play PolicyBytes 中文视频了解 2023 年 10 月政策更新内容&#xff0c;更及…

【原创】java+swing+mysql校园社团管理系统设计与实现

引言&#xff1a; 随着社团组织的日益发展和壮大&#xff0c;社团管理面临着越来越多的挑战。为了提高社团管理的效率和规范性&#xff0c;本文基于javaswing实现了一个社团管理系统。该系统基于C/S架构&#xff0c;采用Java语言开发&#xff0c;数据库采用mysql。 功能分析&…

2023CPSE安博会圆满落幕,英码科技展位吸引众多国内外客户关注!

10月25日-28日&#xff0c;主题为“连接世界&#xff0c;感知未来”的第十九届中国国际社会公共安全博览会&#xff08;以下简称CPSE安博会&#xff09;在深圳福田会展中心隆重举行。英码科技与1100多家企业一起&#xff0c;为来自世界各国的观展嘉宾带来创新性的国产AI智能硬件…

Python 学习2 判断、循环、函数

文章目录 判断语句布尔类型和比较运算符判断语句&#xff1a;if语句 循环语句while循环for循环 函数小结 2023.10.29 周六 老规矩贴一下链接 B站 - 黑马程序员2022python教程 判断语句 布尔类型和比较运算符 Python中布尔类型的基础定义和比较运算符的使用&#xff0c;包括…

网络爬虫-Requests库入门

一、Requests库的安装 以管理员身份运行命令控制台&#xff0c;输入 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 测试&#xff1a;打开IDLE 此时百度的html页面被抓取成功 二、requests库的7个主要方法 三、Requests库的get()方法&#xff1a;获得…

【C++】类和对象(中)之构造函数与析构函数

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.构造函数 1.1概念 1.2特性 2.析构…

基于计算机视觉的 Transformer 研究进展

论文地址&#xff1a; https://kns.cnki.net/kcms/detail/11.2127.tp.20211129.1135.004.html 18页&#xff0c;74篇参考文献 目录 摘 要 1 Transformer 基本原理 1.1 编码器-解码器 1.2 自注意力 1.3 多头注意力 2 在计算机视觉领域的应用 2.1 图像分类 2.1.1 iGPT …

Java使用正则表达式匹配省市县

目录 1.导入依赖 2.编写工具类 3.验证​ 1.导入依赖 <!--为了使用StringUtils--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency>2…

【蓝桥杯选拔赛真题44】python小蓝晨跑 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python小蓝晨跑 一、题目要求 1、编程实现 2、输入输出 二、算法分析

LeetCode | 27. 移除元素

LeetCode | 27. 移除元素 OJ链接 这道题有一个方法是要删除的数据直接后一个数据挪动到前一个数据&#xff0c;这个方法好不好&#xff1f;最坏的情况下时间复杂度是O(N^2) 还有一个方法 定义一个src定义一个dst&#xff0c;原地直接进行赋值&#xff0c;不进行挪动&#xf…

什么是车规级芯片?一起探讨车规级芯片NCV8705MTADJTCG LDO线性稳压器 工作原理、特性参数

关于车规级芯片&#xff08;Automotive Grade Chip&#xff09;&#xff0c;车规级芯片是专门用于汽车行业的芯片&#xff0c;具有高可靠性、高稳定性和低功耗等特点&#xff0c;以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&#xff08;ECU&#xff09;和…

轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1+MySQL

轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1MySQL的技术开发 狂雨小说cms提供一个轻量级小说网站解决方案&#xff0c;基于ThinkPHP5.1MySQL的技术开发。 KYXSCMS,灵活&#xff0c;方便&#xff0c;人性化设计简单易用是最大的特色&#xff0c;是快速架设小说类网站首选…

移动路由器Cellular Router命令执行漏洞复现 [附POC]

文章目录 移动路由器Cellular Router命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 移动路由器Cellular Router命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章…

Java IDEA设置环境变量 以及代码获取

IDEA 设置环境变量 1.进入如图设置&#xff0c;一般的 java 程序和 spring Boot &#xff0c;还是tomcat 都可以从这里进入 2.可以在如下地方手动添加 3. tomcat 类 4.spring boot 类 代码获取指定值 假定我设置如下 代码则如下获取&#xff08;类均为JDK 自带类&…

AI虚拟直播系统源码 24小时直播不停歇 带完整搭建教程

近几年电商直播带货热潮持高不跌&#xff0c;很多商家企业都会选择线上直播卖产品&#xff0c;与此同时&#xff0c;虚拟主播开始盛行&#xff0c;与真人主播相比&#xff0c;品牌虚拟主播无档期风险、离职风险、人设稳定更可控。 虚拟主播的不是为了取代真人主播而开发&#…

重锤式体电阻测试仪应用在什么领域?有什么作用?

重锤式体电阻测试仪是一种用于测量物体电阻的仪器&#xff0c;主要应用于以下几个领域&#xff1a; 电力工业&#xff1a;在电力系统中&#xff0c;重锤式体电阻测试仪可以用于测试电缆、变压器、开关设备等电气设备的电阻值&#xff0c;以确保它们的运行正常。 电子工业&…