密码脱落

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 蓝桥杯的更多相关文章

  1. Java 蓝桥杯 算法训练(VIP) 最大体积

    最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...

  2. python+java蓝桥杯ACM日常算法题训练(一)10基础题

    目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.d ...

  3. JAVA蓝桥杯黄金分割数,涉及到bigdecimal

    import java.math.BigDecimal; public class test { public static void main(String[] args) { BigDecimal ...

  4. java 蓝桥杯算法提高 出现次数最多的整数

    思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...

  5. java 蓝桥杯算法提高 字串统计

    思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数:         通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...

  6. java 蓝桥杯算法提高 矩阵乘法

    思路:根据提示的内容,我们可以得到c[i][j] += a[i][k]*b[k][j],k>=0&&k<s PS:这道题本身不难,但是当我定义A[m][s] B[s][n] ...

  7. java 蓝桥杯算法提高 _3K好数

    nums[i][j] 存的是i位数的时候,首位数字是j的K好数的数目,i从1位开始的结果,去算2位时的结果,去算3位时的结果...最后得到l位的结果.K进制只是一个范围. import java.ut ...

  8. java 蓝桥杯算法提高 _1区间k大数查询

    import java.util.Scanner; public class _1区间K大数查询 { public static void main(String[] args) { Scanner ...

  9. java 蓝桥杯算法提高 _2最大最小公倍数

    解题思路: 1. n是奇数,那就最大的三个数相乘2. n是偶数,得分两种情况了, ①如果n不是3的倍数,那就s=n*(n-1)*(n-3)---n与n-2同为偶数,故排除一个n-2: ②n是3的倍数, ...

随机推荐

  1. 为什么选择Netty作为基础通信框架?

    在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题 ...

  2. Linux显示已经挂载的分区列表

    Linux显示已经挂载的分区列表 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda8 1 ...

  3. Filter组件开发中的SDK基类分析

    DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...

  4. BOM(浏览器对象模型)的一些操作

    一个完整的JavaScript实现由三部分组成: ECMAScript:核心,定义语言基础,规定了语言的组成部分(语法,类型,关键字,保留字,对象等) DOM:文档对象模型,·DOM把整个页面映射成一 ...

  5. input输入框

    7.1,置灰和input框去除置灰 $("#key_SettlementCycle").attr("disabled","disabled" ...

  6. VS2010 EXCEL2010 表格操作的编程实现

    参考: http://blog.csdn.net/wxfy1977/article/details/3847450(另外一种实现方式,数据库方式) http://blog.csdn.net/evkj2 ...

  7. springMVC web项目 对访问数据库的用户名密码进行加密解密

    在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入.properties的变量,例如 在config.proper ...

  8. Entity Framework 乐观并发处理

    Entity Framework 乐观并发处理 有一段时间没有更新博客了,今天终于有一些时间,和大家讨论一个Entity Framework 乐观并发处理的问题.首先需要说明的是,这里提到的 “并发” ...

  9. 华为悦盒 EC6108V9U 破解过程全记录(root扫盲) [原创]

    电信宽带送的 IPTV 盒子,CPU 为 Hi3798M,1G 内存,8G 存储,支持 H.265 硬解码,系统为 Android 4.4.2,却只能看电视,岂不浪费?好在华为厚道,还是留了后门供 D ...

  10. anguar-select2

    <!DOCTYPE html> <html ng-app="App"> <head> <meta charset="UTF-8& ...