华为OD机试 密码截获(C/JAVA)
描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些 “ABBA” 、“ABA”、“A”、“123321”。
但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化
“ABBA"→"12ABBA”、“ABA"→"ABAKK”,“123321"→"51233214”。因为截获的串太长了,而且存在多种可能的情况( "abaaab"可看作是 "aba"或 “baaab”
的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入描述:
在一行上输入一个长度为1≦length(s)≦2500 ,仅由大小写字母和数字构成的字符串s,代表截获的密码。
输出描述:
在一行上输出一个整数,代表最长的有效密码串的长度。
示例1
输入:ABBA
输出:4
说明:在这个样例中,没有无关字符,所以最长的有效密码串就是 “ABBA” 本身,长度为 4 。
示例2
输入:
12HHHHA
输出:4
说明:在这个样例中,最长的有效密码串是 “HHHH” ,长度为 4 。
Java算法源码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
int count = 0; // 满足条件的子字符串的长度
List<Integer> l = new ArrayList<Integer>(); // 存储遍历过程中的长度
if (s.length() == 1) { // 边界值处理
System.out.println(1);
} else if (s.length() == 2) {
if (s.charAt(0) == s.charAt(1)) {
System.out.println(2);
} else {
System.out.println(1);
}
} else {
for (int i = 0; i < s.length(); i++) { // 双指针遍历字符串
for (int j = s.length() - 1; j >= i; j--) { // 参数j要满足条件j > i;一是防止substring()方法出错;
// 二是节省时间,因为i= 1,j = 5和i = 5,j = 1区间的子字符串是同一个
if (s.charAt(i) == s.charAt(j) && isPalindromic(s.substring(i, j + 1))) {
count = j - i + 1; // 存储本次遍历过程中满足条件的子字符串的长度
l.add(count); // 将长度添加到集合l中
}
}
}
Collections.sort(l);
System.out.println(l.get(l.size() - 1));
}
}
// 判断字符串s是否为回文字符串
public static boolean isPalindromic(String s) {
if (s == null) {
return false;
}
for (int i = 0, j = s.length() - 1; j > i; i++, j--) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
}
return true;
}
}