/*
* Q75题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
* 比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
*/
public static void main(String[] args) {
//String strs="google";
String strs="mnbvvvvbabbakkeaad";
int len=longestSymmtricalLength(strs);
System.out.println(len);
}
/*
* consider this string:
* ..aAa..(A represents a string of any length)
* if we already know 'A' is a palindrome,
* we just need to test if the char before 'A' and that after 'A' are the same
* if so,A=aAa now.
* Do it again and again to find the result.
* 考虑这个字符串:
aAa .. ..(代表任意长度的字符串)
如果我们已经知道“A”是一个回文,
我们只需要测试,如果之前的“A”和之后的"A"是否相等
*/
public static int longestSymmtricalLength(String str){
if(str==null||str.length()==0){
return -1;
}
int symLen=1; //总长度
char[] letter=str.toCharArray();
int strLen=str.length();
int curIndex=1; //索引位置
while(curIndex>0&&curIndex<strLen-1){
//odd symmetrical length,the 'pivot' char is letter[curIndex]
<span style="white-space:pre"> </span>//奇对称的长度,letter[curindex]
int i=curIndex-1;
int j=curIndex+1;
while(i>=0&&j<=(strLen-1)&&letter[i]==letter[j]){
i--;
j++;
}
int newLen=j-i-1;
if(newLen>symLen){
symLen=newLen;
}
//even symmetrical length,the 'pivot' chars are letter[curIndex] and letter[curIndex+1]
//即使是对称的长度,letter[curIndex] 和letter[curIndex+1]
//如果相等就再判断它的前后两项是否相等
i=curIndex;
j=curIndex+1;
while(i>=0&&j<=(strLen-1)&&letter[i]==letter[j]){
i--;
j++;
}
newLen=j-i-1;
if(newLen>symLen){
symLen=newLen;
}
curIndex++;
}
return symLen;
}
}