蓝桥杯(java)个人赛真题:密码脱落

密码脱落

	密码脱落

	X星球的考古学家发现了一批古代留下来的密码。
	这些密码是由A、B、C、D 四种植物的种子串成的序列。
	仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
	由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
	
	你的任务是:
	给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
	
	输入一行,表示现在看到的密码串(长度不大于1000)
	要求输出一个正整数,表示至少脱落了多少个种子。
	
	例如,输入:
	ABCBA
	则程序应该输出:
	0
	
	再例如,输入:
	ABDCDCBABC
	则程序应该输出:
	3
	
	资源约定:
	峰值内存消耗(含虚拟机) < 256M
	CPU消耗  < 3000ms
	
	
	请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
	
	所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
	注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
	注意:主类的名字必须是:Main,否则按无效代码处理。

思路:
咳咳,注意,这里是转载的代码 链接转载地址
源码最初始出处,两种解法,解法对比信息那有;
第一种解法思路:从两头向中间靠拢,对比两头,以最小代价补全两边直到对称;
第二种解法思路(也就是我下面的思路):从两头向中间靠拢,对比两头,如果一样,那么两边索引向中间靠拢,如果不一样,则必然此处脱落一个,但是具体脱落的是左边还是右边就要用递归得出最终答案,对比所有答案得到最小值了;

但是,原博主那没有详细解析,嘿嘿!
详细解析:
这题呢,咋一看挺难得,不过真的难,后来才知道这是A组的题,我报的C组;
这题我一开始粗略的分析了下,其实思路我有想到过,奈何基础差,一下想不全;
1、串的头和尾对比 left(头索引) right(尾索引)
11、头和尾相等 ------> left+1 right-1 进入递归
22、头和尾不等,则分两种情况,
221、left+1 right(不变) 进入递归
222、left(不变) right-1 进入递归

package Lqb;

import java.util.Scanner;

public class 密码脱落 {
	 	static int min=0,num=0;
	    static String inputstr;
	public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        inputstr=scanner.next();
        min=inputstr.length();
        fcode(0, min-1, 0);
        System.out.println(min);
    }
    public static  void fcode(int left,int right,int num){
        if (left>=right) {
            min=min<num?min:num;		//每次递归结束都会得到一个num,与全局变量min对比更新,最终得到最小值
        }else {
            if (inputstr.charAt(left)==inputstr.charAt(right)) 	//左右对比是否一致
                fcode(left+1, right-1, num);
            else {
                fcode(left+1, right, num+1);	//左边+1
                fcode(left, right-1, num+1);	//右边-1
            }
        }
        return;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42798905/article/details/88287661
今日推荐