回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
分析:直接遍历然后判断字串时间复杂度为O(N^3),但是我们
遍历对称轴的位置,复杂度是O(n),找到以此对称轴为中心的最长回文串,其复杂度是O(n),这个时候的复杂度是O(n^2)。为了方便理解,这里我大致模拟一下过程。
奇数情况:对称轴为中间的数,所以直接赋值1,外层遍历对称轴的位置,内层控制子串的位置和长度。
核心代码:
for(j = 1;(i-j>=0)&&(i+j<len);j++) {
if(s.charAt(i-j)==s.charAt(i+j))
res+=2;
例如cabac,i = 2时,依次判断1,3和0,4位置,就是从对称轴中心向两边扩展。
偶
数情况:对称轴为中间的线,所以先赋值0,外层遍历对称轴的位置,内层控制子串的位置和长度。
核心代码:
for(j = 0;(i-j>=0)&&(i+j+1<len);j++) {
if(s.charAt(i-j)==s.charAt(i+j+1))
res+=2;
不同的是,由于线是多出来的一个数,所以为向右的时候指针要往右多移一步。
例如cabbac,i = 2时,依次判断2,3和1,4位置,从对称轴中心向两边扩展。
其实手动模拟一下过程即可,上代码吧
import java.util.*;
public class Main{
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
String s = in.next();
int len = s.length();
int i,j,maxn = 0,res = 0;
for(i = 0;i < len ;i++) {//枚举对称轴的位置
res = 1;//奇数位数的回文串,对称轴在中间的数
for(j = 1;(i-j>=0)&&(i+j<len);j++) {
if(s.charAt(i-j)==s.charAt(i+j))
res+=2;
else break;
}
maxn = maxn>res?maxn:res;
res = 0;//偶数位数的回文串,对称轴在中间的线
for(j = 0;(i-j>=0)&&(i+j+1<len);j++) {
if(s.charAt(i-j)==s.charAt(i+j+1))
res+=2;
else break;
}
maxn = maxn>res?maxn:res;
}
System.out.println(maxn);
}
}