【蓝桥杯】[基础练习VIP]完美的代价(Java实现)
2019-03-10 12:12
204 查看
分析:
首先判断字符串是否能构成回文串:
不能构成回文串的话直接输出Impossible。只要只出现奇数次的字母个数多于1个就不能构成回文串。
能构成回文串的话再用递归的方法统计需要移动的最小次数。
Java代码实现:
import java.util.Scanner; public class Main { //检验能否构成回文串 public static boolean IsPossible(String str) { boolean ans = true; int []cnt = new int[26]; int odds=0; //用数组存储数组元素下标对应的序号字母出现的次数 for(int i = 0;i<str.length();i++) { cnt[str.charAt(i)-'a']++; } //统计只出现奇数次的字母的个数 for(int i = 0;i<26;i++) { if(cnt[i]%2==1) odds++; } //如果只出现奇数次的字母多于1个,则不能构成回文串 if(odds>1) { ans=false; } return ans; } //如果能够构成回文串,返回交换的次数 public static int getResult(String str) { if(str.length()==1 || str.length()==2) { return 0; } int tmp = str.lastIndexOf(str.charAt(0));//获取首字符对应的字符在此字符串中最后一次出现处的索引 //tmp为0说明此字符为只出现一次的字母,返回将tmp位置的字符移动到字符串最中间的次数(str.length()/2),递归调用getResult()方法 if(tmp==0) { return str.length()/2 + getResult(str.substring(1,str.length())); } else { //tmp不为0说明首字符有匹配的字母,移除首字母及其对应字母,返回将tmp位置的字符移动到末位置的次数(str.length()-tmp-1),递归调用getResult()方法 StringBuilder sb = new StringBuilder(str); sb.deleteCharAt(tmp); sb.deleteCharAt(0); return str.length()-tmp-1+getResult(sb.toString()); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); String str = in.next(); if(IsPossible(str)) { System.out.println(getResult(str)); } else { System.out.println("Impossible"); } in.close(); } }
另外介绍一下代码中出现的几个方法:
String 类的几个方法:
- public char charAt(int index)
**返回指定索引处的 char 值。**索引范围为从 0 到 length() - 1。序列的第一个 char 值位于索引 0 处,第二个位于索引 1 处,依此类推,这类似于数组索引。
- public int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引。
- public String substring(int beginIndex,int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
StringBuilder 类的方法:
- public StringBuilder deleteCharAt(int index)
移除此序列指定位置上的 char。此序列将缩短一个 char。
相关文章推荐
- 蓝桥杯 BASIC-19 基础练习 完美的代价 Java版
- 蓝桥杯 基础练习VIP 龟兔赛跑预测(java)
- 蓝桥杯 基础练习VIP 矩形面积交(java)
- 蓝桥杯基础练习 完美的代价
- 蓝桥杯基础训练1573:完美的代价(C语言实现)
- 蓝桥杯 基础练习 完美的代价
- 蓝桥杯练习系统—基础练习 完美的代价
- 蓝桥杯 [基础练习VIP] FJ的字符串(Java解题)
- 蓝桥杯练习系统:基础练习 完美的代价
- 蓝桥杯 BASIC-19 基础练习 完美的代价(有贪心特点)
- [蓝桥杯][基础练习VIP]报时助手(Java解题)
- 蓝桥杯 基础练习VIP 龟兔赛跑预测(Java解题)
- 蓝桥杯 BASIC-19 基础练习 完美的代价
- 蓝桥杯 基础练习02 Java实现
- 蓝桥杯 基础练习 完美的代价
- 蓝桥杯 基础练习VIP 矩形面积交(Java解题)
- 蓝桥杯:基础训练——/* 问题描述: 基础练习 完美的代价 时间限制:1.0s 内存限制:512.0MB 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为
- 蓝桥杯 基础练习 分解质因数 java实现
- (蓝桥杯)基础练习 完美的代价
- 蓝桥杯 基础练习VIP 分解质因数(Java解题)