密码脱落 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的倍数, ...
随机推荐
- 使用ifstream和getline读取文件内容[c++]
转载:http://www.cnblogs.com/JCSU/articles/1190685.html 假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion ...
- Linux显示文件和目录的详细资料
Linux显示文件和目录的详细资料 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -l 总用量 56 -rw-r--r-- 1 youhaidong y ...
- 页面某些特定图标的权限,比如导入导出表格,下载等等,这个权限必须在有某个页面查看的权利的基础上(细粒度)(shiro项目中来的四)
一,查找按钮权限的设置 第一步:会根据用户的相关信息去查到它的角色表: SELECT * FROM SYS_USER WHERE user_id='eded77bdf35347249b2bacfa18 ...
- jsp学习笔记之:4种基本语法
一. jsp注释:<%-- js注释 --%> 二. jsp声明: <%! public int count; public String test(){return "j ...
- 一个仿3D的平面游戏页面
package com.totoo.TouhouMassLight;import android.os.Bundle;import android.view.MotionEvent;import an ...
- 我也不知道什么是"莫比乌斯反演"和"杜教筛"
我也不知道什么是"莫比乌斯反演"和"杜教筛" Part0 最近一直在搞这些东西 做了将近超过20道题目吧 也算是有感而发 写点东西记录一下自己的感受 如果您真的 ...
- [BZOJ3110] [Zjoi2013] K大数查询 (树套树)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- Python 终端输出字体颜色
终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表 ...
- VS中Ctrl+F5(开始执行不调试)一闪而过问题
昨天学弟学妹在使用VS2015时,遇到了Ctrl+F5运行完毕程序窗口不能停留的问题,感觉比较奇怪.后来了解到他们建立C++解决方案时,直接选中的是空项目,而这样就会导致这样的现象. 想要达到运行完毕 ...
- PHPStorm 最新版 去掉参数提示 parameter name hints
最新的phpstorm有个默认开启的参数名和类型提示功能, 这对于开发有很大的帮助,但是对于有些同学来说,刚开始可鞥不是很习惯,所以就需要把他给关闭. 在 配置面板中搜索 parameter name ...