Java 蓝桥杯 完美的代价
目录标题
- 问题描述
- 解题思路
- 代码
- 流程图
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如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());}}
}
流程图
Java 蓝桥杯 完美的代价相关推荐
- 蓝桥杯 - 完美的代价(贪心+模拟)
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是:交换两个 ...
- 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯
蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...
- java蓝桥杯练习 学做菜
java蓝桥杯练习 学做菜 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜, ...
- java蓝桥杯练习 蜜蜂飞舞
java蓝桥杯练习 蜜蜂飞舞 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 "两只小蜜蜂呀,飞在花丛中呀--" 话说这天天上飞舞着两只蜜蜂,它们在跳一种奇怪的舞 ...
- Java 蓝桥杯 我们的征途是星辰大海
Java 蓝桥杯 我们的征途是星辰大海 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表空地,curiosity可以穿过它 '#' 代 ...
- JAVA 蓝桥杯 算法提高 阮小二买彩票
JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...
- java蓝桥杯练习 拉马车
java蓝桥杯练习 拉马车 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. ...
- java蓝桥杯练习 幸运数
java蓝桥杯练习 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出 ...
- java蓝桥杯加法变乘法_蓝桥杯-加法变乘法-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
最新文章
- 交互式python shell
- Python中有了列表,为什么还有元组?
- Hermes与开源的Solr、ElasticSearch的不同
- P2633-Count on a tree【主席树,LCA】
- oracle逻辑备份和物理备份,Oracle备份与恢复介绍(物理备份与逻辑备份)
- 论文浅尝 | IRW:基于知识图谱和关系推理的视觉叙事框架
- 在 Linux shell 中自由操作时间变量
- git无法上传大文件
- 等价类划分法用例设计
- U盘量产U盘扩容和U盘芯片检测
- code review流程规范
- 如何解决win8.1系统开机提示sgtool.exe损坏
- LORD MicroStrain 惯性传感系统
- AutoGPT保姆级安装使用教程
- zzulioj1197 考试排名(一)(结构体专题)
- ground truth解释
- 一个表中的字段值用作另一个表的In查询条件
- 真香还是假香,Python处理分析128张Excel表格竟然不到3秒?
- ensp配置FTP进行文件操作
- java银行安全性_Java使用同步方法解决银行取钱的安全问题案例分析