题目描述:
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入描述:
输入一个字符串
输出描述:
返回有效密码串的最大长度
思路:
* 以每个字符(奇数长度的回文串)或者字符间空隙(偶数长度的回文串)分别向左右扩充,记录遇到的最大长度
* 先考虑奇数个数的回文串,再考虑偶数个数的回文串。
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
String s = scanner.nextLine();
int len = s.length();
if (len < 1)
return;
int max = 1;
for (int i = 1; i < len - 1; i++)
{
int k = i - 1;
int j = i + 1;
int count = 0;
while (k >= 0 && j <= len - 1)
{
if (s.charAt(k--) == s.charAt(j++))
count++;
else
break;
}
max = (max >= (count * 2 + 1)) ? max : count * 2 + 1;
}
for (int i = 1; i < len; i++)
{
int k = i - 1;
int j = i;
int count = 0;
while (k >= 0 && j <= len - 1)
{
if (s.charAt(k--) == s.charAt(j++))
count++;
else
break;
}
max = (max >= (count * 2)) ? max : count * 2;
}
System.out.println(max);
}
}
}