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