解题的具体思路都有相应注释,所以直接上代码
public class Palindrome {
public static void main(String[] args) {
Palindrome p = new Palindrome();
System.out.println(p.getMost("")); //0
System.out.println(p.getMost("1")); //1
System.out.println(p.getMost("jdlakjlkljkadlkj"));//9
}
public int getMost(String str)
{
if(str==null||str.length()==0)
{
return 0;
}
int max=0,curL=0;
/**
* str的回文子串的长度可能为奇数,也有可能为偶数,
* 在代码处理时比较麻烦
* 因此通过往每个字符的左右两边各插入一个'#'的方式,
*
* ==>得到chs, 则chs的回文子串必为奇数
*
* 读者朋友可以在纸上画一画,验证上述结论是否成立
*/
char []chs = new char[str.length()*2+1];
int index=0;
for(;index<str.length();index++)
{
chs[2*index] = '#';
chs[2*index+1] = str.charAt(index);
}
chs[2*index]='#';
/**
* 接下来采用中心扩展法,
* 假设最长回文子串的中心是c=1-->c=chs.length-1的某一个位置,
*
* 遍历这些位置,并记录相应的最大长度
*/
for(int c=1;c<chs.length-1;c++)
{
/**
* 假设中心为c
* 则以c为中心,以g为半径,向左右两侧发散
*
* 左侧临界点为c-g>=0,右侧临界点为c+g<=chs.length-1
*/
for(int g=0;(c-g>=0)&&(c+g<=chs.length-1);g++)
{
if(chs[c-g]==chs[c+g])
{
curL = 2*g+1;
if(curL>max)
{
max = curL;
}
}
else{
break;
}
}
}
/**
* 因为在长度为max的回文子串,
* '#'的个数肯定比实际字符串多1,(max必为奇数)
* 所以返回值=max/2
*/
return max/2;
}
}