前言
在春招或者秋招的时候,大厂的笔试题对于字符串的考察算是格外的情有独钟,而字符串问题中最为特别的就要数回文了。本文主要记录了笔者在笔试以及平时刷题中遇到的各种回文相关的题目,一方面方便自己后续复习,另一方面也希望能帮助到看这篇文章的各位。本文收录的问题如下:
- 【华为OJ】字符串运用-密码截取
收集的问题会根据笔者遇到的题目进行不定期的补充。
1.【华为OJ】字符串运用-密码截取
题目描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入:
ABBA
输出:
4
问题分析:
这道题说了这么多,本质上就是求字符串中最长回文子串的长度。而求最长回文子串的方法基本上可归纳为3种:
- 暴力求解,穷举该字符串的每一种子串,然后找出最长的回文子串。时间复杂度为 o ( n 3 ) \ o(n^{3}) o(n3)。
- 将字符串中的每个字符和字符之间的空隙当作回文的中心,然后从中心向两边展开寻找回文子串,通过比较得出最长的回文子串。时间复杂度为 o ( n 2 ) \ o(n^{2}) o(n2)。
- 专门用于解决该问题的 Manacher’s Algorithm。时间复杂度为 o ( n ) \ o(n) o(n)。
接下来我们就分别对上面三种方式的Java代码进行实现:
1).暴力求解法:
public class Main {
public static void main(String[] args) {
String s = "acecaace";
System.out.println(findLongestPalindrome(s));
}
private static boolean isPalindrome(String s){
int len = s.length();
for (int i = 0; i < len; i++){
if (s.charAt(i) != s.charAt(len-1-i)){
return false;
}
}
return true;
}
public static int findLongestPalindrome(String s)