目录标题

  • 问题描述
  • 解题思路
  • 代码
  • 流程图

问题描述

回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)

输入
输入描述:
  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母
输入样例:
5
mamad

输出

输出描述:
  如果可能,输出最少的交换次数。
  否则输出Impossible
输出样例:
3

HINT:时间限制:1.0s 内存限制:512.0MB

解题思路

首先要判断输入的是不是回文数,就先判断每个字母出现的次数以及奇数字母的个数,若奇数次数的字母个数大于1的话就不能构成回文数,在判断交换次数时还要注意如果是1位或者2位字符串的话就直接返回0,因为1,2位的就是回文数不用交换,接下来就是判断每次首字母在后面出现的次数了,如果首字母只有一次的话就把他放到中间,其余的再进行循环运算,就相当于在中间的两边加字符。

代码

import java.util.Locale;
import java.util.Scanner;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int m=scanner.nextInt();String n=scanner.next();if (panduan(n)){System.out.println(cishu(n));}else {System.out.println("Impossible");}}public static boolean panduan(String n){//判断是否构成回文数 就是判断字母出现为奇数次数的个数boolean panduan=true;int [] num=new int[26];int geshu=0;//记录奇数次的个数for (int i=0;i<n.length();i++){num[n.charAt(i)-'a']++;//得到每个字母对应的数值}//统计奇数次字母出现的个数for (int i=0;i< num.length;i++){if (num[i]%2==1){geshu++;}}if (geshu>1){panduan=false;//若大于1 则不能形成回文数}return panduan;}//如果为回文数 则判断交换次数public static  int cishu(String n){int cishu=0;if(n.length()==1 || n.length()==2){//只有1位和2位的字符串 就是回文数 返回0次return 0;}cishu=n.lastIndexOf(n.charAt(0));//每次首字母最后出现位置的索引if (cishu==0){return n.length()/2 + cishu(n.substring(1,n.length()));//如果首字母只出现了首字母放到中间 //substring的作用为截取第1位到最后一位的字符串。}else {StringBuilder stringBuilder=new StringBuilder(n);//如果不为1次的话移动的次数就是 长度-cishu-1 然后再删除计算过的。stringBuilder.deleteCharAt(cishu);//删除已经计算过的//deleteCharAt为移除此位置的字符stringBuilder.deleteCharAt(0);return n.length()-cishu-1 + cishu(stringBuilder.toString());}}
}

流程图

Created with Raphaël 2.3.0开始输入字符串的长度m以及字符串n定义panduan为真,一个26位的数组,用geshu记录奇数次字符的个数依次计算每个字母对应的数值奇数次字符的个数大于1panduan为假定义cishu来接收字母的索引如果只有一个或者两个字符返回0结束计算每次首字母在后面出现位置的索引如果只出现了一次循环计算需要的次数构成回文数输出需要的次数输出Impossible建立一个stringBuilder来简便操作字符串删除已经计算过的和首位字符重新计算需要的次数yesyesnoyesnoyesno

Java 蓝桥杯 完美的代价相关推荐

  1. 蓝桥杯 - 完美的代价(贪心+模拟)

    回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是:交换两个 ...

  2. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  3. java蓝桥杯练习 学做菜

    java蓝桥杯练习 学做菜 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜, ...

  4. java蓝桥杯练习 蜜蜂飞舞

    java蓝桥杯练习 蜜蜂飞舞 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 "两只小蜜蜂呀,飞在花丛中呀--" 话说这天天上飞舞着两只蜜蜂,它们在跳一种奇怪的舞 ...

  5. Java 蓝桥杯 我们的征途是星辰大海

    Java 蓝桥杯 我们的征途是星辰大海 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表空地,curiosity可以穿过它 '#' 代 ...

  6. JAVA 蓝桥杯 算法提高 阮小二买彩票

    JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...

  7. java蓝桥杯练习 拉马车

    java蓝桥杯练习 拉马车 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. ...

  8. java蓝桥杯练习 幸运数

    java蓝桥杯练习 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出 ...

  9. java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

最新文章

  1. 交互式python shell
  2. Python中有了列表,为什么还有元组?
  3. Hermes与开源的Solr、ElasticSearch的不同
  4. P2633-Count on a tree【主席树,LCA】
  5. oracle逻辑备份和物理备份,Oracle备份与恢复介绍(物理备份与逻辑备份)
  6. 论文浅尝 | IRW:基于知识图谱和关系推理的视觉叙事框架
  7. 在 Linux shell 中自由操作时间变量
  8. git无法上传大文件
  9. 等价类划分法用例设计
  10. U盘量产U盘扩容和U盘芯片检测
  11. code review流程规范
  12. 如何解决win8.1系统开机提示sgtool.exe损坏
  13. LORD MicroStrain 惯性传感系统
  14. AutoGPT保姆级安装使用教程
  15. zzulioj1197 考试排名(一)(结构体专题)
  16. ground truth解释
  17. 一个表中的字段值用作另一个表的In查询条件
  18. 真香还是假香,Python处理分析128张Excel表格竟然不到3秒?
  19. ensp配置FTP进行文件操作
  20. java银行安全性_Java使用同步方法解决银行取钱的安全问题案例分析

热门文章

  1. (四)基于Multisim的超外差接收系统:检波器的设计
  2. 架构设计的立方体扩展
  3. github issue 搜索_回顾 2020 年 GitHub 的大事件,你知道多少?
  4. TypeScript,初次见面,请多指教 ?
  5. shell中日期的使用当前日期的加减
  6. div垂直,水平居中
  7. 多浏览器判断,切换及使用
  8. Qt之QFileSystemWatcher
  9. 改变你一生命运的话语 不得不信
  10. KVO 实现两个页面之间的通信