给定一个字符串,找最大的连续回文字串,其中连续的定义是左侧依次递增,右侧依次递减,如 aba,符合条件,bcdefedcb符合条件,注意abba不符合。初看可能是用模式匹配或者KMP的算法,用这些应该也可以,但其实我们可以注意到,这里的字符是递增,递减的特殊关系,因此可以从第二个开始即i=1的位置,同时向他的两边找,找的数目记为j,从j=1开始;如果符合则继续找j++,否则退出j的循环,同时找的位置从i+j-1开始;注意向两边找的长度j的范围:
1.当i是在字符串前段,j <= i,即没有遍历到超过给定串的一半;
2.当i是在字符串后段,j<=(len-i -1),已经超过了一半;
以下是代码:
public class MaxIncrePalindromeLen {
public static void main(String[] args) {
String s1 = "abddabcbad";
String s2 = "abcbcdd";
String s3 = "cdefedcdefedcba";
String s4 = "bcbefed";
String s5 = "aba";
String s6 = "aaaaaaaaba";
System.out.println(maxLen(s1));
System.out.println(maxLen(s2));
System.out.println(maxLen(s3));
System.out.println(maxLen(s4));
System.out.println(maxLen(s5));
System.out.println(maxLen(s6));
System.out.println(maxLen("3"));
System.out.println(maxLen("dd"));
System.out.println(maxLen(null));
}
public static int maxLen(String str) {
if (null == str || str.length() < 3) {
return 0;
}
int max = 0;
int len = str.length();
for (int i = 1; i < len - 1; i++) {
for (int j = 1; j <= ((i <= len / 2) ? i : (len - i - 1)); j++) {
if (str.charAt(i - j) == (str.charAt(i) - j) && (str.charAt(i + j) == str.charAt(i) - j)) {
max = (2 * j + 1 > max) ? (2 * j + 1) : max;
} else {
i = i + j - 1;
break;
}
}
}
return max;
}
}