回文这种题还是经常考的
主要还是考对字符处理这一块的内容
如果你能够想到JAVA的charAt()方法,那AC这题基本上没有问题啦
这次做到就多念它两边,因为我一开始就没有想到...
代码思路来自 Micek博主
中心扩展算法
中心扩展算法是用于寻找回文子串的一种常见方法之一。该算法基于一个简单的观察:回文串的中心可能是一个字符,也可能是两个相邻字符之间。因此,对于每个可能的中心,我们向两边扩展,直到无法继续扩展或达到了字符串的边界。
具体步骤如下:
- 从字符串的第一个字符开始,遍历每个字符。
- 对于每个字符,以其为中心向两边扩展,分别检查奇数长度和偶数长度的回文串。
- 在扩展的过程中,一旦发现不再是回文串,就停止扩展。
- 在扩展的过程中记录当前回文串的长度。
- 继续遍历字符串中的下一个字符,重复以上步骤,直到遍历完整个字符串。
以下可以不看了,反正java就是慢呜呜
这种方法的时间复杂度为 O(n^2),其中 n 是字符串的长度。虽然在最坏情况下的时间复杂度较高,但对于大多数实际输入,这种方法是非常高效的。
好了,那么其实就是我们需要写一个(LongestPalindromeLength)LPL方法,在其中再调用另一个我们需要写的方法expandAroundCenter
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args)throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println(LPL(bf.readLine()));
}
private static int LPL(String s) {
if(s == null) return 0;
int start = 0;int end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i); //计算奇回文
int len2 = expandAroundCenter(s, i, i+1);//计算偶回文
int len = Math.max(len1, len2);
if(len>end-start) {
start = i-(len-1)/2;
end = i+len/2;
}
}
return end-start+1;
}
private static int expandAroundCenter(String s , int left , int right) {
while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)) {
left--;right++;
}
return right-left-1; //因为第一次循环时用起始的left计算了一次,故而最终结果比实际长度多1
}
}
只有三十行其实如果思路没有卡住这真的非常简单啊