密码脱落 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的倍数, ...
随机推荐
- JXL组件生成报表报错(二)
JXL组件生成报表 1.具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonam ...
- 如何修改64位Eclipse中的代码字体大小
1.双击打开Eclipse,如下图所示: 2.找到菜单栏中的Window,单击它,选择Preferences 3.在左侧的树形菜单中找到General--->Appearance--->C ...
- UEFI模式 Thinkpad t470p Ubuntu 16.04 LTS
准备阶段 使用官方推荐的Rufus制作U盘启动盘 在Windows 10系统下压缩出来一些空间(60G),不要分配盘符 系统设置 在Bios中关闭secure boot (设置为Disenabled) ...
- 异常-----freemarker.core.ParseException: Token manager error
一,案例一 1.1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: L ...
- 原生JS实现tab切换--web前端开发
tab切换非常常见,应用非常广泛,比较实用,一般来说是一个网站必不可少的一个效果.例如:https://123.sogou.com/中的一个tab部分: 1.案例源代码 <!DOCTYPE ht ...
- 在MyEclipse 10中配置tomcat田服务器时出现的问题以及解觉办法
今天刚刚重装电脑,为了实训的一个项目要使用到MyEclipse开发工具但是在配置服务器之后运行时出现了问题 错误:java.lang.UnsupportedClassVersionError: org ...
- [BZOJ4825][HNOI2017]单旋spaly
BZOJ Luogu 题目太长了,就不放了. 题解 首先声明一点,无论是splay还是spaly,插入一个新的元素,都要rotate到根!所以说题目也算是给了一个错误示范吧. 我们发现把最值旋转到根并 ...
- MSIL实用指南-IL版hello world
我们学习编程开始时,一般用输出"hello world"的一段程序. C#版的"hello world"是 using System; namespace L0 ...
- 软件测试必备-前端知识点之css基础及ps的用法
CSS 一. css定义 css样式表.层叠样式表,级联样式表 二. css基础语法 1. 写style标签,放在head标签里面的最后位置 2. 自己写的css代码,放在style标签里面 三. c ...
- php数组基础知识
php数组 <?php $kele = array('张三',10 => '李四', 'PHP中文网' , '去PHP中文网学PHP', 19 => '王二' , '小明'); // ...