class PlalindromeString{
//判断一个字符串是否为回文串,后面算法用不到
private boolean isPlalindrome(String s){
int len = s.length();
for(int i=0;i<len/2;i++){
if(s.charAt(i)!=s.charAt(len-1-i)){
return false;
}
}return false;
}
//对字符串进行预处理,加上#
private String preHandleString(String s){
StringBuffer sb = new StringBuffer();
int len = sb.length();
sb.append('#');
for(int i =0;i<sb.length()-1;i++){
sb.append(s.charAt(i));
sb.append('#');
}
return sb.toString();
}
//寻找最长的回文串
public String findLongestPlalindromesString(String s){
String str = preHandleString(s);
int len = str.length();
//右边界
int rightSide = 0;
//右边界对应的的回文串中心
int rightSideCenter = 0;
//存下以每个字符为中心的会问长度的一半(向下取整)
int[] halfLenArr = new int[len];
//记录回文中心
int center = 0;
//记录最长回文长度
int longestHalf = 0;
//是否需要中心扩展
for(int i=0;i<len-1;i++){
//是否在右边界覆盖范围之内
boolean needCalc = true;
if(rightSide>i){
int leftCenter = 2 * rightSideCenter - i;
halfLenArr[i] = halfLenArr[leftCenter];
// 如果超过了右边界,进行调整
if(i + halfLenArr[i] > rightSide) { //意思是aba的话,arr长度为1,是因为> 8-7 = 1
halfLenArr[i] = rightSide - i; //这一行不是很懂
}
if(i + halfLenArr[leftCenter] < rightSide) {
// 直接推出结论
needCalc = false;
}
}
//中心拓展
if(needCalc){
while(i - 1 - halfLenArr[i] >= 0 && i + 1 + halfLenArr[i] < len){
if(str.charAt(i + 1 + halfLenArr[i]) == str.charAt(i - 1 - halfLenArr[i])){
halfLenArr[i]++;
}else
break;
}
}
//更新右边界和中心
rightSide = i + halfLenArr[i];
rightSideCenter = i;
//记录最长回文串
if(halfLenArr[i] > longestHalf) {
center = i;
longestHalf = halfLenArr[i];
}
}
StringBuffer sb = new StringBuffer();
for(int i=center-longestHalf+1;i<=center+longestHalf;i+=2){
sb.append(str.charAt(i));
}
return sb.toString();
}
}
class Main{
public static void main(String[] args) {
PlalindromeString ps =new PlalindromeString();
String[] testStrArr = new String[]{
"abcdcef",
"adaelele",
"cabadabae",
"aaaabcdefgfedcbaa",
"aaba",
"aaaaaaaaa"
};
for(String str:testStrArr){
System.out.println(String.format("原字符:%s",str));
System.out.println(String.format("最长回文串:%s",ps.findLongestPlalindromesString(str)));
System.out.println();
}
}
}
输出不太对,,在最长回文串后没有输出来东西,,再想想后改回来,上面的是没有错的。