密码脱落

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. Caused by: java.lang.ClassNotFoundException: org.jbpm.pvm.internal.processengine.SpringHelper

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  2. 关于tween.js测试介绍

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>t ...

  3. freemarker中的if...elseif...else语句(七)

    freemarker中的if...elseif...else语句 1.设计示例 <#if student.studentAge lt 12> ${student.studentName}不 ...

  4. n人围成一圈报数

    题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位 思路:用一个数组存这n个人,里面的初始状态全设为1,表示都还在圈子里面. ...

  5. TP5 数组分页

    需要 use think\Page; 我这个是 Page是从tp3.2的移到5.0来用的,如果你的里面没有这个也可以移动过来 PHP代码: $page= $this->request->p ...

  6. jsp学习笔记之:内置对象

    application对象: 设置一个名为name,值为val的应用内共享的数据 <% application.setAttribute("name",val); %> ...

  7. 【BZOJ1997】Planar(2-sat)

    [BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...

  8. 【BZOJ1087】【SCOI2005】互不侵犯(状态压缩,动态规划)

    题面 这种傻逼题懒得粘贴了... 题解 傻逼题 \(f[i][j][k]\)表示当前第\(i\)列,当前放置状态为\(j\),已经放了\(k\)个 暴力判断状态合法性,暴力判断转移合法性,然后统计答案 ...

  9. Bzoj4872: [Shoi2017]分手是祝愿

    题面 Bzoj Sol 首先从大向小,能关就关显然是最优 然后 设\(f[i]\)表示剩下最优要按i个开关的期望步数,倒推过来就是 \[ f[i]=f[i-1]*i*inv[n]+f[i+1]*(n- ...

  10. web安全之SQL注入

    一.sql注入是一种将sql代码添加到输入参数中 传递到sql服务器解析并执行得一种攻击手法 例: $sql = "SELECT * FROM goods WHERE Id = 1" ...