字母脱落

X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。

例如,输入:

ABCBA

则程序应该输出:

0

再例如,输入:

ABDCDCBABC

则程序应该输出:

3

package the_blue_cup;
//密码脱落
import java.util.Scanner;

public class Demo_12 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String characterString = sc.nextLine();
		
		System.out.println(findCode(characterString));
		
	}
	//该方法返回最少字母缺失个数
	public static int findCode(String string) {
		char[] characterList = string.toCharArray();//将字符串转化为数组
		//初始化计数
		int count = 0;
		//分别从两头往中间寻找相同字母,并计数
		int leftCount, rightCount;
		从两边开始遍历,
		for (int i = 0, j = characterList.length - 1; i < j;) {//迭代后操作写在循环内部
			//若对应值相等
			if (characterList[i] == characterList[j]) {
				i++;
				j--;
				continue;//跳出本次循环
			}else {
				//若对应值不相等
				leftCount = 0;//左侧计数初始化为0
				int leftCursor = i;//创建一个指针变量从该索引处往右寻找
				
				while(characterList[leftCursor] != characterList[j]) {
					leftCursor++;//不相等指针向前移动
					leftCount++;//并计数
				}
				//类似
				rightCount = 0;
				int rightCursor = j;
				while(characterList[rightCursor] != characterList[i]) {
					rightCursor--;//向左侧移动
					rightCount++;//并计数
				}
				//将最短路径赋给对应变量
				if (leftCount > rightCount) {
					j -= rightCount;
				}else {
					i += leftCount;
				}
				//计算最短路径
				count += (leftCount < rightCount) ? leftCount : rightCount;
			}
		}
			
		return count;
	}

}

输入:ABDCDCBABC
输出:3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值