密码脱落 JAVA 蓝桥杯
密码脱落
X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。
例如,输入:
ABCBA
则程序应该输出:
0
再例如,输入:
ABDCDCBABC
则程序应该输出:
3
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 3000ms
首先,这道题的思路其实和39节台阶的想法是类似滴 我给大家举一个小例子
1231 有两种加法
先判断第一位1,和最后一位1 相等 继续下两个数
判断第二位2,和倒数第二位3 不相等
这时候有两种方法
one 复制第二位,生成123(2)1;这样就可以继续读1231的第三位和倒数二位 即判断3
two 复制倒数第二位,生成1(3)231;这样就可以继续读1231的第二位和倒数三位 即判断2
import java.util.Scanner;
public class T12 {
private static int count;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String temp=sc.next();
count=temp.length();
int num=0;
check(0,temp.length()-1,temp,num);
System.out.println("最终结果"+count);
}
private static void check(int left, int right, String temp, int num) {
// TODO 自动生成的方法存根
if(left>=right)
{
if(num<count)
{
count=num;
}
}else {
//判断相等 继续下两个数
if(temp.charAt(left)==temp.charAt(right))
{
check(left+1,right-1,temp,num);
}else {
//one 复制第二位,生成123(2)1;这样就可以继续读1231的第三位和倒数二位 即判断3 因为添加了数字2所以num+1
check(left+1,right,temp,num+1);
//two 复制倒数第二位,生成1(3)231;这样就可以继续读1231的第二位和倒数三位 即判断2 因为添加了数字3所以num+1
check(left,right-1,temp,num+1);
}
}
}
}

高级 可以查看每一步的结果
其实我本来想实现输出最优解法,和输出所有产生的结果的(>_<)但是没有成功,希望来探讨。
import java.util.Scanner;
public class T12a {
private static int count;
static boolean add=true;
public static void main(String[] args) {
//num 为每一次结果所添加的字母的个数 count是最小个数
Scanner sc=new Scanner(System.in);
String temp=sc.next();
StringBuffer varchar=new StringBuffer();
count=temp.length();
int num=0;
check(0,temp.length()-1,temp,varchar,num);
System.out.println("最终结果"+count);
}
private static void check(int left, int right,String varchar, StringBuffer answer, int num) {
// TODO 自动生成的方法存根
if(left>=right)
{
//例如12321,当left=3,right=3的时候,将中间的字符串3插入到StringBuffer里
if(left==right)
{
int temp=answer.length()/2;
answer.insert(temp,varchar.charAt(left));
}
if(num<count)
{
count=num;
for(int i=0;i<answer.length();i++)
{
System.out.print(answer.charAt(i));
}
System.out.println();
}
//(移除)例如12321,当left=3,right=3的时候,将中间的字符串3移除
int temp=answer.length()/2;
answer.deleteCharAt(temp);
//设置开始还原
add=false;
return;
}else {
if(varchar.charAt(left)==varchar.charAt(right))
{
add(answer,varchar,left);
check(left+1,right-1,varchar,answer,num);
remove(answer,varchar);
}else {
add(answer,varchar,left);
check(left+1,right,varchar,answer,num+1);
remove(answer,varchar);
add(answer,varchar,right);
check(left,right-1,varchar,answer,num+1);
remove(answer,varchar);
}
}
}
public static void add(StringBuffer answer,String varchar,int num)
{
//例如1231 第一个数和最后一个数相等,将11插入到Stringbuffer里
int temp=answer.length()/2;
answer.insert(temp,varchar.charAt(num));
answer.insert(temp,varchar.charAt(num));
}
public static void remove(StringBuffer answer,String varchar)
{
if(!add)
{
int temps=answer.length()/2-1;
answer.deleteCharAt(temps);
answer.deleteCharAt(temps);
//还原结束后设置为开始添加
add=true;
}
}
}

密码脱落 JAVA 蓝桥杯的更多相关文章
- Java 蓝桥杯 算法训练(VIP) 最大体积
最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...
- python+java蓝桥杯ACM日常算法题训练(一)10基础题
目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.d ...
- JAVA蓝桥杯黄金分割数,涉及到bigdecimal
import java.math.BigDecimal; public class test { public static void main(String[] args) { BigDecimal ...
- java 蓝桥杯算法提高 出现次数最多的整数
思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...
- java 蓝桥杯算法提高 字串统计
思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数: 通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...
- java 蓝桥杯算法提高 矩阵乘法
思路:根据提示的内容,我们可以得到c[i][j] += a[i][k]*b[k][j],k>=0&&k<s PS:这道题本身不难,但是当我定义A[m][s] B[s][n] ...
- java 蓝桥杯算法提高 _3K好数
nums[i][j] 存的是i位数的时候,首位数字是j的K好数的数目,i从1位开始的结果,去算2位时的结果,去算3位时的结果...最后得到l位的结果.K进制只是一个范围. import java.ut ...
- java 蓝桥杯算法提高 _1区间k大数查询
import java.util.Scanner; public class _1区间K大数查询 { public static void main(String[] args) { Scanner ...
- java 蓝桥杯算法提高 _2最大最小公倍数
解题思路: 1. n是奇数,那就最大的三个数相乘2. n是偶数,得分两种情况了, ①如果n不是3的倍数,那就s=n*(n-1)*(n-3)---n与n-2同为偶数,故排除一个n-2: ②n是3的倍数, ...
随机推荐
- Linux以GB显示内存大小
Linux以GB显示内存大小 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -g total used free shared buffers ca ...
- Linux显示所有运行中的进程
Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...
- 反射(C#编程)
反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对 ...
- ArcGIS API for JavaScript 4.4 版本加载谷歌地图
ArcGIS API for JavaScript 4.X 版本升级后,API发生了很大的变化. 其中就支持了WebEarth展示,主要是通过 esri/views/SceneView 实现的. 在新 ...
- spring整合JMS
浏览博客时看到大神写的,直接转载过来收藏了.原文地址:http://elim.iteye.com/blog/1893038
- redis和spring整合使用
第一步,在项目中加入redis的pom代码: <dependency> <groupId>redis.clients</groupId> <artifactI ...
- [AH/HNOI2017]单旋
这道题可以用LCT做,开set,LCT,二叉树 操作1:直接开set,找到它要插入的位置,一定是前驱,后缀中deep最大的(显然手玩) 操作2:set+LCT询问路径,直接手动提上去,因为树的形态不变 ...
- [BZOJ1588] [HNOI2002] 营业额统计 (treap)
Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额. ...
- Tomcat 请求处理流程详解
Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...
- Oracle删除控制文件恢复
控制文件被删除后,系统崩溃,下面介绍下如何恢复控制文件 SQL> conn / as sysdbaConnected to an idle instance.SQL> startup no ...